bool GameObject::CreateTriangleMesh( CPhysX const * pPhysX ) { bool bResult = false; if( pPhysX && pPhysX->GetPhysics() && !m_BufVertices.empty() && !m_BufIndices.empty() ) { uint NumVerticies = m_BufVertices.size() / 3; uint NumTriangles = m_BufIndices.size() / 3; //Create pointer for vertices physx::PxVec3* verts = new physx::PxVec3[ NumVerticies ]; int ii = -1; for( uint i = 0; i < NumVerticies; ++i ) { ++ii; verts[ i ].x = m_BufVertices[ ii ]; verts[ i ].y = m_BufVertices[ ++ii ]; verts[ i ].z = m_BufVertices[ ++ii ]; } //Create pointer for indices physx::PxU16 *tris = new physx::PxU16[ m_BufIndices.size() ]; for( uint i = 0; i < m_BufIndices.size(); ++i ) tris[ i ] = m_BufIndices[ i ]; // Build physical model physx::PxTriangleMeshDesc TriMeshDesc; TriMeshDesc.points.count = NumVerticies; TriMeshDesc.points.stride = sizeof(physx::PxVec3); TriMeshDesc.points.data = verts; TriMeshDesc.triangles.count = NumTriangles; TriMeshDesc.triangles.stride = 3 * sizeof(physx::PxU16); TriMeshDesc.triangles.data = tris; TriMeshDesc.flags = physx::PxMeshFlag::e16_BIT_INDICES;// | physx::PxMeshFlag::eFLIPNORMALS; PxToolkit::MemoryOutputStream writeBuffer; PxCooking* pCooking = pPhysX->GetCooking(); if( pCooking && TriMeshDesc.isValid() ) if( pCooking->cookTriangleMesh( TriMeshDesc, writeBuffer ) ) { PxToolkit::MemoryInputData readBuffer( writeBuffer.getData(), writeBuffer.getSize() ); m_pTriangleMesh = pPhysX->GetPhysics()->createTriangleMesh( readBuffer ); bResult = true; } delete[] verts; delete[] tris; } return bResult; }
PxTriangleMesh* PxToolkit::createTriangleMesh32(PxPhysics& physics, PxCooking& cooking, PxTriangleMeshDesc* meshDesc) { PxToolkit::MemoryOutputStream writeBuffer; bool status = cooking.cookTriangleMesh(*meshDesc, writeBuffer); if(!status) return NULL; PxToolkit::MemoryInputData readBuffer(writeBuffer.getData(), writeBuffer.getSize()); return physics.createTriangleMesh(readBuffer); }
PxTriangleMesh* PxToolkit::createTriangleMesh32(PxPhysics& physics, PxCooking& cooking, const PxVec3* verts, PxU32 vertCount, const PxU32* indices32, PxU32 triCount) { PxTriangleMeshDesc meshDesc; meshDesc.points.count = vertCount; meshDesc.points.stride = sizeof(PxVec3); meshDesc.points.data = verts; meshDesc.triangles.count = triCount; meshDesc.triangles.stride = 3*sizeof(PxU32); meshDesc.triangles.data = indices32; PxToolkit::MemoryOutputStream writeBuffer; bool status = cooking.cookTriangleMesh(meshDesc, writeBuffer); if(!status) return NULL; PxToolkit::MemoryInputData readBuffer(writeBuffer.getData(), writeBuffer.getSize()); return physics.createTriangleMesh(readBuffer); }
void Apex::LoadDynamicTriangleMesh(int numVerts, PxVec3* verts, ObjectInfo info) { PxRigidDynamic* meshActor = mPhysics->createRigidDynamic(PxTransform::createIdentity()); PxShape* meshShape, *convexShape; if(meshActor) { //meshActor->setRigidDynamicFlag(PxRigidDynamicFlag::eKINEMATIC, true); 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))); meshShape->setFlag(PxShapeFlag::eUSE_SWEPT_BOUNDS, true); PxConvexMeshDesc convexDesc; convexDesc.points.count = numVerts; convexDesc.points.stride = sizeof(PxVec3); convexDesc.points.data = verts; convexDesc.flags = PxConvexFlag::eCOMPUTE_CONVEX; if(!convexDesc.isValid()) return; PxToolkit::MemoryOutputStream buf; if(!mCooking->cookConvexMesh(convexDesc, buf)) return; PxToolkit::MemoryInputData input(buf.getData(), buf.getSize()); PxConvexMesh* convexMesh = mPhysics->createConvexMesh(input); PxConvexMeshGeometry convexGeom = PxConvexMeshGeometry(convexMesh); convexShape = meshActor->createShape(convexGeom, *defaultMaterial); //convexShape->setLocalPose(PxTransform(PxVec3(info.x,info.y,info.z))); //convexShape->setFlag(PxShapeFlag::eSIMULATION_SHAPE, false); convexShape->setFlag(PxShapeFlag::eSIMULATION_SHAPE, true); meshShape->setFlag(PxShapeFlag::eSIMULATION_SHAPE, false); meshActor->setRigidDynamicFlag(PxRigidDynamicFlag::eKINEMATIC, false); meshActor->setGlobalPose(PxTransform(PxVec3(info.x,info.y,info.z), PxQuat(info.ry, PxVec3(0.0f,1.0f,0.0f)))); mScene[mCurrentScene]->addActor(*meshActor); dynamicActors.push_back(meshActor); } }
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); } }