void GLUTGame::RenderGeometry(PxGeometryHolder h, bool textured) { switch (h.getType()) { case PxGeometryType::eBOX: glScalef(h.box().halfExtents.x, h.box().halfExtents.y, h.box().halfExtents.z); if (textured) RenderTexturedCube(2.0f); else glutSolidCube(2.0f); break; case PxGeometryType::eSPHERE: glutSolidSphere(h.sphere().radius, RENDER_DETAIL, RENDER_DETAIL); break; case PxGeometryType::eCONVEXMESH: PxConvexMesh* mesh = h.convexMesh().convexMesh; const PxU32 nbPolys = mesh->getNbPolygons(); const PxU8* polygons = mesh->getIndexBuffer(); const PxVec3* verts = mesh->getVertices(); PxU32 numTotalTriangles = 0; for (PxU32 i = 0; i < nbPolys; i++) { PxHullPolygon data; mesh->getPolygonData(i, data); const PxU32 nbTris = data.mNbVerts - 2; const PxU8 vref0 = polygons[data.mIndexBase + 0]; for (PxU32 j = 0; j < nbTris; j++) { const PxU32 vref1 = polygons[data.mIndexBase + 0 + j + 1]; const PxU32 vref2 = polygons[data.mIndexBase + 0 + j + 2]; if (numTotalTriangles < MAX_NUM_CONVEXMESH_TRIANGLES) { gConvexMeshTriIndices[3 * numTotalTriangles + 0] = vref0; gConvexMeshTriIndices[3 * numTotalTriangles + 1] = vref1; gConvexMeshTriIndices[3 * numTotalTriangles + 2] = vref2; numTotalTriangles++; } } } if (numTotalTriangles < MAX_NUM_CONVEXMESH_TRIANGLES) { glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, 0, verts); glDrawElements(GL_TRIANGLES, numTotalTriangles * 3, GL_UNSIGNED_INT, gConvexMeshTriIndices); glDisableClientState(GL_VERTEX_ARRAY); } } }
void PxScaleRigidActor(PxRigidActor& actor, PxReal scale, bool scaleMassProps) { PX_CHECK_AND_RETURN(scale > 0, "PxScaleRigidActor requires that the scale parameter is greater than zero"); Ps::InlineArray<PxShape*, 64> shapes; shapes.resize(actor.getNbShapes()); actor.getShapes(shapes.begin(), shapes.size()); for(PxU32 i=0;i<shapes.size();i++) { shapes[i]->setLocalPose(scalePosition(shapes[i]->getLocalPose(), scale)); PxGeometryHolder h = shapes[i]->getGeometry(); switch(h.getType()) { case PxGeometryType::eSPHERE: h.sphere().radius *= scale; break; case PxGeometryType::ePLANE: break; case PxGeometryType::eCAPSULE: h.capsule().halfHeight *= scale; h.capsule().radius *= scale; break; case PxGeometryType::eBOX: h.box().halfExtents *= scale; break; case PxGeometryType::eCONVEXMESH: h.convexMesh().scale.scale *= scale; break; case PxGeometryType::eTRIANGLEMESH: h.triangleMesh().scale.scale *= scale; break; case PxGeometryType::eHEIGHTFIELD: h.heightField().heightScale *= scale; h.heightField().rowScale *= scale; h.heightField().columnScale *= scale; break; case PxGeometryType::eINVALID: case PxGeometryType::eGEOMETRY_COUNT: default: PX_ASSERT(0); } shapes[i]->setGeometry(h.any()); } if(!scaleMassProps) return; PxRigidDynamic* dynamic = (&actor)->is<PxRigidDynamic>(); if(!dynamic) return; PxReal scale3 = scale*scale*scale; dynamic->setMass(dynamic->getMass()*scale3); dynamic->setMassSpaceInertiaTensor(dynamic->getMassSpaceInertiaTensor()*scale3*scale*scale); dynamic->setCMassLocalPose(scalePosition(dynamic->getCMassLocalPose(), scale)); }