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