void PhysXMeshCollider::applyGeometry() { if (!mMesh.isLoaded()) { setGeometry(PxSphereGeometry(0.01f)); // Dummy return; } FPhysXMesh* physxMesh = static_cast<FPhysXMesh*>(mMesh->_getInternal()); if (mMesh->getType() == PhysicsMeshType::Convex) { PxConvexMeshGeometry geometry; geometry.scale = PxMeshScale(toPxVector(getScale()), PxIdentity); geometry.convexMesh = physxMesh->_getConvex(); setGeometry(geometry); } else // Triangle { PxTriangleMeshGeometry geometry; geometry.scale = PxMeshScale(toPxVector(getScale()), PxIdentity); geometry.triangleMesh = physxMesh->_getTriangle(); setGeometry(geometry); } }
void Apex::LoadTriangleMesh(int numVerts, PxVec3* verts, ObjectInfo info) { PxRigidStatic* meshActor = mPhysics->createRigidStatic(PxTransform::createIdentity()); PxShape* meshShape; if(meshActor) { PxTriangleMeshDesc meshDesc; meshDesc.points.count = numVerts; meshDesc.points.stride = sizeof(PxVec3); meshDesc.points.data = verts; //meshDesc.triangles.count = numInds/3.; //meshDesc.triangles.stride = 3*sizeof(int); //meshDesc.triangles.data = inds; PxToolkit::MemoryOutputStream writeBuffer; bool status = mCooking->cookTriangleMesh(meshDesc, writeBuffer); if(!status) return; PxToolkit::MemoryInputData readBuffer(writeBuffer.getData(), writeBuffer.getSize()); PxTriangleMeshGeometry triGeom; triGeom.triangleMesh = mPhysics->createTriangleMesh(readBuffer); triGeom.scale = PxMeshScale(PxVec3(info.sx,info.sy,info.sz),physx::PxQuat::createIdentity()); meshShape = meshActor->createShape(triGeom, *defaultMaterial); meshShape->setLocalPose(PxTransform(PxVec3(info.x,info.y,info.z), PxQuat(info.ry, PxVec3(0.0f,1.0f,0.0f)))); meshShape->setFlag(PxShapeFlag::eUSE_SWEPT_BOUNDS, true); meshShape->setFlag(PxShapeFlag::eSIMULATION_SHAPE, true); mScene[mCurrentScene]->addActor(*meshActor); } }