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