void BuildPrism(MeshAnalyser meshAnalyser, Vector3 extend, MeshBuilder mb) { foreach (var triangle in meshAnalyser.Triangles) { mb.AddTriangle(-triangle, new Color(1, 0, 0, 1)); mb.AddTriangle(triangle + extend, new Color(0, 0, 1, 1)); } foreach (var edge in meshAnalyser.FindBorders()) { var extentEdge = edge + extend; mb.AddTriangle(new Triangle(edge.a, edge.b, extentEdge.b), new Color(0, 1, 0, 1)); mb.AddTriangle(new Triangle(edge.a, extentEdge.b, extentEdge.a), new Color(0, 1, 0, 1)); } }
public Mesh GenerateVolumnMesh(Collider collider) { var lightDir = Manager.MainLight.transform.forward; if (collider is BoxCollider) { var mat = collider.transform.localToWorldMatrix; var box = collider as BoxCollider; var verts = boxMesh.vertices; Array.Copy(boxMeshBase.vertices, verts, boxMeshBase.vertices.Length); boxMesh.triangles = boxMeshBase.triangles; MeshBuilder mb = new MeshBuilder(128); // Transform from local to world pos; for (int i = 0; i < verts.Length; i++) { verts[i] = mat.MultiplyPoint(Vector3.Scale(verts[i] / 2, box.size) + box.center); } // Build volume mesh MeshAnalyser meshAnalyser = new MeshAnalyser(12); for (int i = 0; i < boxMesh.triangles.Length / 3; i++) { var idx = i * 3; var triangle = new Triangle(verts[boxMesh.triangles[idx + 0]], verts[boxMesh.triangles[idx + 1]], verts[boxMesh.triangles[idx + 2]]); if (Vector3.Dot(lightDir, triangle.normal) < 0) { meshAnalyser.AddTriangle(triangle); } /* * if (Vector3.Dot(lightDir, triangle.normal) < 0) * BuildPrism(-triangle, lightDir * VolumeStretchDistance, mb);*/ } BuildPrism(meshAnalyser, lightDir * VolumeStretchDistance, mb); return(mb.ToMesh()); } return(null); }