MCPcopy Create free account
hub / github.com/NVIDIAGameWorks/PhysX / visualizeHeightField

Function visualizeHeightField

physx/source/physx/src/NpShapeManager.cpp:636–701  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

634}
635
636static 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);

Callers 1

visualizeFunction · 0.85

Calls 7

getTriangleFunction · 0.85
outputTriangleFunction · 0.85
getVertexMethod · 0.80
isValidTriangleMethod · 0.80
PxMat44Class · 0.50
transformMethod · 0.45

Tested by

no test coverage detected