| 634 | } |
| 635 | |
| 636 | static void visualizeHeightField(const PxHeightFieldGeometry& hfGeometry, RenderOutput& out, const PxTransform& absPose, const PxBounds3& cullbox, bool useCullBox) |
| 637 | { |
| 638 | const HeightField* heightfield = static_cast<const HeightField*>(hfGeometry.heightField); |
| 639 | |
| 640 | // PT: TODO: the debug viz for HFs is minimal at the moment... |
| 641 | const PxU32 scolor = gCollisionShapeColor; |
| 642 | const PxMat44 midt = PxMat44(PxIdentity); |
| 643 | |
| 644 | HeightFieldUtil hfUtil(hfGeometry); |
| 645 | |
| 646 | const PxU32 nbRows = heightfield->getNbRowsFast(); |
| 647 | const PxU32 nbColumns = heightfield->getNbColumnsFast(); |
| 648 | const PxU32 nbVerts = nbRows * nbColumns; |
| 649 | const PxU32 nbTriangles = 2 * nbVerts; |
| 650 | |
| 651 | out << midt << scolor; // PT: no need to output the same matrix/color for each triangle |
| 652 | |
| 653 | if(useCullBox) |
| 654 | { |
| 655 | const PxTransform pose0((cullbox.maximum + cullbox.minimum)*0.5f); |
| 656 | const PxBoxGeometry boxGeometry((cullbox.maximum - cullbox.minimum)*0.5f); |
| 657 | |
| 658 | PxU32* results = reinterpret_cast<PxU32*>(PX_ALLOC(sizeof(PxU32)*nbTriangles, "tmp triangle indices")); |
| 659 | |
| 660 | bool overflow = false; |
| 661 | PxU32 nbTouchedTris = PxMeshQuery::findOverlapHeightField(boxGeometry, pose0, hfGeometry, absPose, results, nbTriangles, 0, overflow); |
| 662 | |
| 663 | PxDebugLine* segments = out.reserveSegments(nbTouchedTris*3); |
| 664 | |
| 665 | for(PxU32 i=0; i<nbTouchedTris; i++) |
| 666 | { |
| 667 | const PxU32 index = results[i]; |
| 668 | PxTriangle currentTriangle; |
| 669 | PxMeshQuery::getTriangle(hfGeometry, absPose, index, currentTriangle); |
| 670 | |
| 671 | //The check has been done in the findOverlapHeightField |
| 672 | //if(heightfield->isValidTriangle(index) && heightfield->getTriangleMaterial(index) != PxHeightFieldMaterial::eHOLE) |
| 673 | { |
| 674 | outputTriangle(segments, currentTriangle.verts[0], currentTriangle.verts[1], currentTriangle.verts[2], scolor); |
| 675 | segments+=3; |
| 676 | } |
| 677 | } |
| 678 | PX_FREE(results); |
| 679 | } |
| 680 | else |
| 681 | { |
| 682 | // PT: transform vertices only once |
| 683 | PxVec3* tmpVerts = reinterpret_cast<PxVec3*>(PX_ALLOC(sizeof(PxVec3)*nbVerts, "PxVec3")); |
| 684 | // PT: TODO: optimize the following line |
| 685 | for(PxU32 i=0;i<nbVerts;i++) |
| 686 | tmpVerts[i] = absPose.transform(hfUtil.hf2shapep(heightfield->getVertex(i))); |
| 687 | |
| 688 | for(PxU32 i=0; i<nbTriangles; i++) |
| 689 | { |
| 690 | if(heightfield->isValidTriangle(i) && heightfield->getTriangleMaterial(i) != PxHeightFieldMaterial::eHOLE) |
| 691 | { |
| 692 | PxU32 vi0, vi1, vi2; |
| 693 | heightfield->getTriangleVertexIndices(i, vi0, vi1, vi2); |
no test coverage detected