public bool OverlapBox(OBB obb, List <GameObject> gameObjects)
        {
            gameObjects.Clear();
            if (!_objectTree.OverlapBox(obb, _nodeBuffer))
            {
                return(false);
            }

            var boundsQConfig = new ObjectBounds.QueryConfig();

            boundsQConfig.ObjectTypes  = GameObjectTypeHelper.AllCombined;
            boundsQConfig.NoVolumeSize = Vector3Ex.FromValue(_nonMeshObjectSize);

            foreach (SphereTreeNode <GameObject> node in _nodeBuffer)
            {
                GameObject sceneObject = (GameObject)node.Data;
                if (sceneObject == null || !sceneObject.activeInHierarchy)
                {
                    continue;
                }

                OBB worldOBB = ObjectBounds.CalcWorldOBB(sceneObject, boundsQConfig);
                if (obb.IntersectsOBB(worldOBB))
                {
                    gameObjects.Add(sceneObject);
                }
            }

            return(gameObjects.Count != 0);
        }
Example #2
0
        public List <GameObject> OverlapBox(OBB obb)
        {
            List <SphereTreeNode <GameObject> > overlappedNodes = _objectTree.OverlapBox(obb);

            if (overlappedNodes.Count == 0)
            {
                return(new List <GameObject>());
            }

            var boundsQConfig = new ObjectBounds.QueryConfig();

            boundsQConfig.ObjectTypes  = GameObjectTypeHelper.AllCombined;
            boundsQConfig.NoVolumeSize = Vector3Ex.FromValue(RTScene.Get.Settings.NonMeshObjectSize);

            var overlappedObjects = new List <GameObject>();

            foreach (SphereTreeNode <GameObject> node in overlappedNodes)
            {
                GameObject sceneObject = (GameObject)node.Data;
                if (sceneObject == null || !sceneObject.activeInHierarchy)
                {
                    continue;
                }

                OBB worldOBB = ObjectBounds.CalcWorldOBB(sceneObject, boundsQConfig);
                if (obb.IntersectsOBB(worldOBB))
                {
                    overlappedObjects.Add(sceneObject);
                }
            }

            return(overlappedObjects);
        }
Example #3
0
        public List <Vector3> OverlapVerts(OBB obb, MeshTransform meshTransform)
        {
            if (!_isBuilt)
            {
                Build();
            }

            OBB           meshSpaceOBB    = meshTransform.InverseTransformOBB(obb);
            HashSet <int> usedIndices     = new HashSet <int>();
            var           overlappedNodes = _tree.OverlapBox(meshSpaceOBB);

            if (overlappedNodes.Count == 0)
            {
                return(new List <Vector3>());
            }

            var overlappedVerts = new List <Vector3>(50);

            foreach (var node in overlappedNodes)
            {
                int          triangleIndex = node.Data.TriangleIndex;
                MeshTriangle triangleInfo  = _mesh.GetTriangle(triangleIndex);
                var          modelVerts    = triangleInfo.Vertices;

                for (int ptIndex = 0; ptIndex < modelVerts.Length; ++ptIndex)
                {
                    int vertIndex = triangleInfo.GetVertIndex(ptIndex);
                    if (usedIndices.Contains(vertIndex))
                    {
                        continue;
                    }

                    Vector3 modelVert = modelVerts[ptIndex];
                    if (BoxMath.ContainsPoint(modelVert, meshSpaceOBB.Center, meshSpaceOBB.Size, meshSpaceOBB.Rotation))
                    {
                        overlappedVerts.Add(meshTransform.TransformPoint(modelVert));
                        usedIndices.Add(vertIndex);
                    }
                }
            }

            return(overlappedVerts);
        }
Example #4
0
        public bool OverlapVerts(OBB obb, MeshTransform meshTransform, List <Vector3> verts)
        {
            verts.Clear();
            if (!_isBuilt)
            {
                Build();
            }

            OBB meshSpaceOBB = meshTransform.InverseTransformOBB(obb);

            if (!_tree.OverlapBox(meshSpaceOBB, _nodeBuffer))
            {
                return(false);
            }

            _vertexIndexSet.Clear();
            foreach (var node in _nodeBuffer)
            {
                int          triangleIndex = node.Data.TriangleIndex;
                MeshTriangle triangleInfo  = _mesh.GetTriangle(triangleIndex);
                var          modelVerts    = triangleInfo.Vertices;

                for (int ptIndex = 0; ptIndex < modelVerts.Length; ++ptIndex)
                {
                    int vertIndex = triangleInfo.GetVertIndex(ptIndex);
                    if (_vertexIndexSet.Contains(vertIndex))
                    {
                        continue;
                    }

                    Vector3 modelVert = modelVerts[ptIndex];
                    if (BoxMath.ContainsPoint(modelVert, meshSpaceOBB.Center, meshSpaceOBB.Size, meshSpaceOBB.Rotation))
                    {
                        verts.Add(meshTransform.TransformPoint(modelVert));
                        _vertexIndexSet.Add(vertIndex);
                    }
                }
            }

            return(verts.Count != 0);
        }