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); }
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); }
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); }
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); }