private void CreateSelectionIndicators(RuntimeSurfaceGeometry surface, bool isfloor) { var vertices = surface.GetComponent <MeshCollider>().sharedMesh.vertices; var localToWorldMatrix = surface.transform.localToWorldMatrix; for (var i = 0; i < vertices.Length; i++) { var currentVertexWorldPosition = localToWorldMatrix.MultiplyPoint(vertices[i]); Vector3 previousVertexWorldPosition; Vector3 nextVertexWorldPosition; if (isfloor) { previousVertexWorldPosition = localToWorldMatrix.MultiplyPoint(vertices[i >= 1 ? i - 1 : vertices.Length - 1]); nextVertexWorldPosition = localToWorldMatrix.MultiplyPoint(vertices[i < vertices.Length - 1 ? i + 1 : 0]); } else { previousVertexWorldPosition = localToWorldMatrix.MultiplyPoint(vertices[i < vertices.Length - 1 ? i + 1 : 0]); nextVertexWorldPosition = localToWorldMatrix.MultiplyPoint(vertices[i >= 1 ? i - 1 : vertices.Length - 1]); } selectionVisualizationIndicators.Add(GeometryUtilities.CreateSurfaceSelectionIndicator($"Vertex ({i})", surface.transform, currentVertexWorldPosition, nextVertexWorldPosition, previousVertexWorldPosition)); } }
public void DisplaySelectionState(bool state) { if (state) { bool collectedTopSurface = false; Vector3 topLeftWorldPosition = Vector3.zero; Vector3 topRightWorldPosition = Vector3.zero; Vector3 bottomRightWorldPosition = Vector3.zero; Vector3 bottomLeftWorldPosition = Vector3.zero; Transform topParent = null; Transform bottomParent = null; if (TopSurface) { var localToWorldMatrix = TopSurface.transform.localToWorldMatrix; var mesh = TopSurface.GetComponent <MeshCollider>().sharedMesh; topLeftWorldPosition = localToWorldMatrix.MultiplyPoint(mesh.vertices[1]); topRightWorldPosition = localToWorldMatrix.MultiplyPoint(mesh.vertices[2]); topParent = TopSurface.transform; bottomRightWorldPosition = localToWorldMatrix.MultiplyPoint(mesh.vertices[3]); bottomLeftWorldPosition = localToWorldMatrix.MultiplyPoint(mesh.vertices[0]); bottomParent = TopSurface.transform; collectedTopSurface = true; } if (MiddleSurface) { var localToWorldMatrix = MiddleSurface.transform.localToWorldMatrix; var mesh = MiddleSurface.GetComponent <MeshCollider>().sharedMesh; if (!collectedTopSurface) { topLeftWorldPosition = localToWorldMatrix.MultiplyPoint(mesh.vertices[1]); topRightWorldPosition = localToWorldMatrix.MultiplyPoint(mesh.vertices[2]); topParent = MiddleSurface.transform; collectedTopSurface = true; } bottomRightWorldPosition = localToWorldMatrix.MultiplyPoint(mesh.vertices[3]); bottomLeftWorldPosition = localToWorldMatrix.MultiplyPoint(mesh.vertices[0]); bottomParent = MiddleSurface.transform; } if (BottomSurface) { var localToWorldMatrix = BottomSurface.transform.localToWorldMatrix; var mesh = BottomSurface.GetComponent <MeshCollider>().sharedMesh; if (!collectedTopSurface) { topLeftWorldPosition = localToWorldMatrix.MultiplyPoint(mesh.vertices[1]); topRightWorldPosition = localToWorldMatrix.MultiplyPoint(mesh.vertices[2]); topParent = BottomSurface.transform; } bottomRightWorldPosition = localToWorldMatrix.MultiplyPoint(mesh.vertices[3]); bottomLeftWorldPosition = localToWorldMatrix.MultiplyPoint(mesh.vertices[0]); bottomParent = BottomSurface.transform; } selectionVisualizationIndicators.Add(GeometryUtilities.CreateSurfaceSelectionIndicator("Top-Left", topParent, topLeftWorldPosition, topRightWorldPosition, bottomLeftWorldPosition)); selectionVisualizationIndicators.Add(GeometryUtilities.CreateSurfaceSelectionIndicator("Top-Right", topParent, topRightWorldPosition, bottomRightWorldPosition, topLeftWorldPosition)); selectionVisualizationIndicators.Add(GeometryUtilities.CreateSurfaceSelectionIndicator("Bottom-Right", bottomParent, bottomRightWorldPosition, bottomLeftWorldPosition, topRightWorldPosition)); selectionVisualizationIndicators.Add(GeometryUtilities.CreateSurfaceSelectionIndicator("Bottom-Left", bottomParent, bottomLeftWorldPosition, topLeftWorldPosition, bottomRightWorldPosition)); } else { foreach (var indicator in selectionVisualizationIndicators) { Destroy(indicator); } selectionVisualizationIndicators.Clear(); } }