bool BoxController::updateKinematicProxy() { // Set extents for kinematic proxy if(mKineActor) { PxShape* shape = getKineShape(); PX_ASSERT(shape->getGeometryType() == PxGeometryType::eBOX); PxBoxGeometry bg; shape->getBoxGeometry(bg); bg.halfExtents = CCTtoProxyExtents(mHalfHeight, mHalfSideExtent, mHalfForwardExtent, mProxyScaleCoeff); shape->setGeometry(bg); } return true; }
osg::Node* createNodeForActor( PxRigidActor* actor ) { if ( !actor ) return NULL; std::vector<PxShape*> shapes( actor->getNbShapes() ); osg::ref_ptr<osg::MatrixTransform> transform = new osg::MatrixTransform; transform->setMatrix( toMatrix(PxMat44(actor->getGlobalPose())) ); osg::ref_ptr<osg::Geode> geode = new osg::Geode; transform->addChild( geode.get() ); PxU32 num = actor->getShapes( &(shapes[0]), actor->getNbShapes() ); for ( PxU32 i=0; i<num; ++i ) { PxShape* shape = shapes[i]; osg::Matrix localMatrix = toMatrix( PxMat44(actor->getGlobalPose()) ); osg::Vec3 localPos = toVec3( shape->getLocalPose().p ); osg::Quat localQuat(shape->getLocalPose().q.x, shape->getLocalPose().q.y, shape->getLocalPose().q.z, shape->getLocalPose().q.w); switch ( shape->getGeometryType() ) { case PxGeometryType::eSPHERE: { PxSphereGeometry sphere; shape->getSphereGeometry( sphere ); osg::Sphere* sphereShape = new osg::Sphere(localPos, sphere.radius); geode->addDrawable( new osg::ShapeDrawable(sphereShape) ); } break; case PxGeometryType::ePLANE: // TODO break; case PxGeometryType::eCAPSULE: { PxCapsuleGeometry capsule; shape->getCapsuleGeometry( capsule ); osg::Capsule* capsuleShape = new osg::Capsule( localPos, capsule.radius, capsule.halfHeight * 2.0f); capsuleShape->setRotation( localQuat ); geode->addDrawable( new osg::ShapeDrawable(capsuleShape) ); } break; case PxGeometryType::eBOX: { PxBoxGeometry box; shape->getBoxGeometry( box ); osg::Box* boxShape = new osg::Box(localPos, box.halfExtents[0] * 2.0f, box.halfExtents[1] * 2.0f, box.halfExtents[2] * 2.0f); boxShape->setRotation( localQuat ); geode->addDrawable( new osg::ShapeDrawable(boxShape) ); } break; case PxGeometryType::eCONVEXMESH: { PxConvexMeshGeometry convexMeshGeom; shape->getConvexMeshGeometry( convexMeshGeom ); // TODO: consider convexMeshGeom.scale PxConvexMesh* convexMesh = convexMeshGeom.convexMesh; if ( convexMesh ) { /*for ( unsigned int i=0; i<convexMesh->getNbPolygons(); ++i ) { }*/ // TODO } } break; case PxGeometryType::eTRIANGLEMESH: { PxTriangleMeshGeometry triangleMeshGeom; shape->getTriangleMeshGeometry( triangleMeshGeom ); // TODO: consider triangleMeshGeom.scale PxTriangleMesh* triangleMesh = triangleMeshGeom.triangleMesh; if ( triangleMesh ) { osg::ref_ptr<osg::Vec3Array> va = new osg::Vec3Array( triangleMesh->getNbVertices() ); for ( unsigned int i=0; i<va->size(); ++i ) (*va)[i] = toVec3( *(triangleMesh->getVertices() + i) ) * localMatrix; osg::ref_ptr<osg::DrawElements> de; if ( triangleMesh->getTriangleMeshFlags()&PxTriangleMeshFlag::eHAS_16BIT_TRIANGLE_INDICES ) { osg::DrawElementsUShort* de16 = new osg::DrawElementsUShort(GL_TRIANGLES); de = de16; const PxU16* indices = (const PxU16*)triangleMesh->getTriangles(); for ( unsigned int i=0; i<triangleMesh->getNbTriangles(); ++i ) { de16->push_back( indices[3 * i + 0] ); de16->push_back( indices[3 * i + 1] ); de16->push_back( indices[3 * i + 2] ); } } else { osg::DrawElementsUInt* de32 = new osg::DrawElementsUInt(GL_TRIANGLES); de = de32; const PxU32* indices = (const PxU32*)triangleMesh->getTriangles(); for ( unsigned int i=0; i<triangleMesh->getNbTriangles(); ++i ) { de32->push_back( indices[3 * i + 0] ); de32->push_back( indices[3 * i + 1] ); de32->push_back( indices[3 * i + 2] ); } } geode->addDrawable( createGeometry(va.get(), NULL, NULL, de.get()) ); } } break; case PxGeometryType::eHEIGHTFIELD: { PxHeightFieldGeometry hfGeom; shape->getHeightFieldGeometry( hfGeom ); // TODO: consider hfGeom.*scale PxHeightField* heightField = hfGeom.heightField; if ( heightField ) { // TODO } } break; } } return transform.release(); }
void SimulationEventCallback::destroyWallBlock(const PxRigidBody& _krRigidBody, const PxShape& _krShape) { Entity* wallBlock = static_cast<Entity*>(_krRigidBody.userData); if (find(m_destroyedWallBlocks.begin(), m_destroyedWallBlocks.end(), wallBlock) != m_destroyedWallBlocks.end()) { return; } PxBoxGeometry geometry; _krShape.getBoxGeometry(geometry); PxTransform transform = _krRigidBody.getGlobalPose(); Matrix44 transformation = PhysXMatrix::toMatrix44(transform); PxVec3 angularVelocity = _krRigidBody.getAngularVelocity(); PxVec3 linearVelocity = _krRigidBody.getLinearVelocity(); m_destroyedWallBlocks.push_back(wallBlock); GazEngine::removeEntity(*wallBlock); float halfSize = geometry.halfExtents.x / 2.0f; Matrix44 fragment0Transformation = transformation; getTranslation3(fragment0Transformation) += Vector3(-halfSize, halfSize, 0.0f); Entity* pFragment0 = CreateWallBlock(fragment0Transformation, halfSize, *m_pParentNode); PxRigidBody* pFragment0RigidBody = pFragment0->getSingleComponent<PhysXBody>()->getActor()->isRigidBody(); pFragment0RigidBody->setAngularVelocity(angularVelocity); pFragment0RigidBody->setLinearVelocity(linearVelocity); // The body only got a position in the constructor... lets give it a rotation too. PxTransform fragment0Transform = transform; fragment0Transform.p += PxVec3(-halfSize, halfSize, 0.0f); pFragment0RigidBody->setGlobalPose(fragment0Transform); Matrix44 fragment1Transformation = transformation; getTranslation3(fragment1Transformation) += Vector3(halfSize, halfSize, 0.0f); Entity* pFragment1 = CreateWallBlock(fragment1Transformation, halfSize, *m_pParentNode); PxRigidBody* pFragment1RigidBody = pFragment1->getSingleComponent<PhysXBody>()->getActor()->isRigidBody(); pFragment1RigidBody->setAngularVelocity(angularVelocity); pFragment1RigidBody->setLinearVelocity(linearVelocity); // The body only got a position in the constructor... lets give it a rotation too. PxTransform fragment1Transform = transform; fragment1Transform.p += PxVec3(halfSize, halfSize, 0.0f); pFragment1RigidBody->setGlobalPose(fragment1Transform); Matrix44 fragment2Transformation = transformation; getTranslation3(fragment2Transformation) += Vector3(halfSize, -halfSize, 0.0f); Entity* pFragment2 = CreateWallBlock(fragment2Transformation, halfSize, *m_pParentNode); PxRigidBody* pFragment2RigidBody = pFragment2->getSingleComponent<PhysXBody>()->getActor()->isRigidBody(); pFragment2RigidBody->setAngularVelocity(angularVelocity); pFragment2RigidBody->setLinearVelocity(linearVelocity); // The body only got a position in the constructor... lets give it a rotation too. PxTransform fragment2Transform = transform; fragment2Transform.p += PxVec3(halfSize, -halfSize, 0.0f); pFragment2RigidBody->setGlobalPose(fragment2Transform); Matrix44 fragment3Transformation = transformation; getTranslation3(fragment3Transformation) += Vector3(-halfSize, -halfSize, 0.0f); Entity* pFragment3 = CreateWallBlock(fragment3Transformation, halfSize, *m_pParentNode); PxRigidBody* pFragment3RigidBody = pFragment3->getSingleComponent<PhysXBody>()->getActor()->isRigidBody(); pFragment3RigidBody->setAngularVelocity(angularVelocity); pFragment3RigidBody->setLinearVelocity(linearVelocity); // The body only got a position in the constructor... lets give it a rotation too. PxTransform fragment3Transform = transform; fragment3Transform.p += PxVec3(-halfSize, -halfSize, 0.0f); pFragment3RigidBody->setGlobalPose(fragment3Transform); }