static void _writePrism(DestructionVertexData output, Vector3[] p, Vector3[] n, Vector2[] uv, bool truncated )
        {
            if (truncated)
            {
                Profiler.BeginSample("_writeTruncatedPrism");

                //just two triangles
                for (uint i = 0; i < 2 * 3; i += 3)
                {
                    int triOffset = output.allocateTriangle();
                    if (triOffset == -1)
                        break;

                    uint i0 = truncatedPrismIndices[i + 0];
                    uint i1 = truncatedPrismIndices[i + 1];
                    uint i2 = truncatedPrismIndices[i + 2];

                    uint in0 = truncatedPrismNormalIndices[i + 0];
                    uint in1 = truncatedPrismNormalIndices[i + 1];
                    uint in2 = truncatedPrismNormalIndices[i + 2];

                    uint i0m = i0 % 3;
                    uint i1m = i1 % 3;
                    uint i2m = i2 % 3;

                    output.setPositions(triOffset, p[i0], p[i1], p[i2]);
                    output.setNormals(triOffset, n[in0], n[in1], n[in2]);
                    //output->setTangents ( triOffset, t[i0m] , t[i1m] , t[i2m] );
                    output.setTexcoords(triOffset, uv[i0m], uv[i1m], uv[i2m]);
                }

                Profiler.EndSample();
            }
            else
            {
                Profiler.BeginSample("_writePrism");

                Array.Copy(n, N, 6);
                N[6] = Vector3.Cross(p[2] - p[5], p[4] - p[5]);
                N[7] = Vector3.Cross(p[3] - p[5], p[2] - p[5]);
                N[8] = Vector3.Cross(p[4] - p[5], p[0] - p[3]);

                //          {
                //              n[0], n[1], n[2], n[3], n[4], n[5],
                //              ( Vector3.Cross( p[2] - p[5], p[4] - p[5] ) ),
                //              ( Vector3.Cross( p[3] - p[5], p[2] - p[5] ) ),
                //              ( Vector3.Cross( p[4] - p[3], p[0] - p[3] ) ),
                //          };

                for (uint i = 0; i < N_PRISM_TRIS * 3; i += 3)
                {
                    int triOffset = output.allocateTriangle();
                    if (triOffset == -1)
                        break;

                    uint i0 = prismIndices[i + 0];
                    uint i1 = prismIndices[i + 1];
                    uint i2 = prismIndices[i + 2];

                    uint in0 = prismNormalIndices[i + 0];
                    uint in1 = prismNormalIndices[i + 1];
                    uint in2 = prismNormalIndices[i + 2];

                    uint i0m = i0 % 3;
                    uint i1m = i1 % 3;
                    uint i2m = i2 % 3;

                    output.setPositions(triOffset, p[i0], p[i1], p[i2]);
                    output.setNormals(triOffset, N[in0], N[in1], N[in2]);
                    //output->setTangents ( triOffset, t[i0m] , t[i1m] , t[i2m] );
                    output.setTexcoords(triOffset, uv[i0m], uv[i1m], uv[i2m]);
                }
                Profiler.EndSample();
            }
        }
        public static bool generateTrianglesFromShape(DestructionVertexData output, Shape shape, DestructionShapeParams shapeParams, DestructionSensor[] sensors, uint numSensors)
        {
            //rhi::debugDraw::addSphere( toVector3( sensor.posLSWithScale ), sensor.radius, 0xFF0000FF, true );

            bool collisionState = false;

            for (int itri = 0; itri < shape.numIndices_; itri += 3)
            {
                int itri0 = shape.indices_[itri];
                int itri1 = shape.indices_[itri + 1];
                int itri2 = shape.indices_[itri + 2];

                Vector3[] n =
                {
                    shape.GetNormal( itri0 ),
                    shape.GetNormal( itri1 ),
                    shape.GetNormal( itri2 ),
                };
                //Vector3 t[3] =
                //{
                //    Vector3( picoPolyShape::getTangent( shape, itri0 ) ),
                //    Vector3( picoPolyShape::getTangent( shape, itri1 ) ),
                //    Vector3( picoPolyShape::getTangent( shape, itri2 ) ),
                //};

                Vector2[] uv =
                {
                    shape.GetTexcoord( itri0 ),
                    shape.GetTexcoord( itri1 ),
                    shape.GetTexcoord( itri2 ),
                };

                Vector3[] p =
                {
                    shape.GetPosition( itri0 ),
                    shape.GetPosition( itri1 ),
                    shape.GetPosition( itri2 ),
                };

                bool collisions = false;

                for (uint i = 0; i < numSensors && !collisions; ++i)
                {
                    collisions = _testCollision(p, sensors[i].posLS, sensors[i].radius, shapeParams.scale);
                }

                if (collisions)
                {
                    collisionState = true;
                    _processRecurse(output, p, n, uv, sensors, numSensors, shapeParams, 0);
                }
                else
                {
                    int triOffset = output.allocateTriangle();
                    if (triOffset == -1)
                        break;

                    output.setPositions(triOffset, p[0], p[1], p[2]);
                    output.setNormals(triOffset, n[0], n[1], n[2]);
                    //output->setTangents ( triOffset, t[i0m] , t[i1m] , t[i2m] );
                    output.setTexcoords(triOffset, uv[0], uv[1], uv[2]);
                }
            }

            return collisionState;
        }