| 554 | } |
| 555 | |
| 556 | static void visualizeTriangleMesh(const PxTriangleMeshGeometry& geometry, RenderOutput& out, const PxTransform& pose, const PxBounds3& cullbox, const PxReal fscale, bool visualizeShapes, bool visualizeEdges, bool useCullBox) |
| 557 | { |
| 558 | const TriangleMesh* triangleMesh = static_cast<const TriangleMesh*>(geometry.triangleMesh); |
| 559 | |
| 560 | const PxMat44 midt(PxIdentity); |
| 561 | const Matrix34 absPose(PxMat33(pose.q) * geometry.scale.toMat33(), pose.p); |
| 562 | |
| 563 | PxU32 nbTriangles = triangleMesh->getNbTrianglesFast(); |
| 564 | const PxU32 nbVertices = triangleMesh->getNbVerticesFast(); |
| 565 | const PxVec3* vertices = triangleMesh->getVerticesFast(); |
| 566 | const void* indices = triangleMesh->getTrianglesFast(); |
| 567 | const bool has16Bit = triangleMesh->has16BitIndices(); |
| 568 | |
| 569 | // PT: TODO: don't render the same edge multiple times |
| 570 | |
| 571 | PxU32* results = NULL; |
| 572 | if(useCullBox) |
| 573 | { |
| 574 | const Gu::Box worldBox( |
| 575 | (cullbox.maximum + cullbox.minimum)*0.5f, |
| 576 | (cullbox.maximum - cullbox.minimum)*0.5f, |
| 577 | PxMat33(PxIdentity)); |
| 578 | |
| 579 | // PT: TODO: use the callback version here to avoid allocating this huge array |
| 580 | results = reinterpret_cast<PxU32*>(PX_ALLOC_TEMP(sizeof(PxU32)*nbTriangles, "tmp triangle indices")); |
| 581 | LimitedResults limitedResults(results, nbTriangles, 0); |
| 582 | Midphase::intersectBoxVsMesh(worldBox, *triangleMesh, pose, geometry.scale, &limitedResults); |
| 583 | nbTriangles = limitedResults.mNbResults; |
| 584 | |
| 585 | if(visualizeShapes) |
| 586 | { |
| 587 | const PxU32 scolor = gCollisionShapeColor; |
| 588 | |
| 589 | out << midt << scolor; // PT: no need to output this for each segment! |
| 590 | |
| 591 | PxDebugLine* segments = out.reserveSegments(nbTriangles*3); |
| 592 | for(PxU32 i=0; i<nbTriangles; i++) |
| 593 | { |
| 594 | PxVec3 wp[3]; |
| 595 | getTriangle(*triangleMesh, results[i], wp, vertices, indices, absPose, has16Bit); |
| 596 | outputTriangle(segments, wp[0], wp[1], wp[2], scolor); |
| 597 | segments+=3; |
| 598 | } |
| 599 | } |
| 600 | } |
| 601 | else |
| 602 | { |
| 603 | if(visualizeShapes) |
| 604 | { |
| 605 | const PxU32 scolor = gCollisionShapeColor; |
| 606 | |
| 607 | out << midt << scolor; // PT: no need to output this for each segment! |
| 608 | |
| 609 | // PT: TODO: use SIMD |
| 610 | PxVec3* transformed = reinterpret_cast<PxVec3*>(PX_ALLOC(sizeof(PxVec3)*nbVertices, "PxVec3")); |
| 611 | for(PxU32 i=0;i<nbVertices;i++) |
| 612 | transformed[i] = absPose.transform(vertices[i]); |
| 613 |
no test coverage detected