PxRigidDynamic* PxCloneDynamic(PxPhysics& physicsSDK, const PxTransform& transform, const PxRigidDynamic& from) { PxRigidDynamic* to = physicsSDK.createRigidDynamic(transform); if(!to) return NULL; copyStaticProperties(*to, from); to->setRigidDynamicFlags(from.getRigidDynamicFlags()); to->setMass(from.getMass()); to->setMassSpaceInertiaTensor(from.getMassSpaceInertiaTensor()); to->setCMassLocalPose(from.getCMassLocalPose()); to->setLinearVelocity(from.getLinearVelocity()); to->setAngularVelocity(from.getAngularVelocity()); to->setLinearDamping(from.getAngularDamping()); to->setAngularDamping(from.getAngularDamping()); to->setMaxAngularVelocity(from.getMaxAngularVelocity()); PxU32 posIters, velIters; from.getSolverIterationCounts(posIters, velIters); to->setSolverIterationCounts(posIters, velIters); to->setSleepThreshold(from.getSleepThreshold()); to->setContactReportThreshold(from.getContactReportThreshold()); return to; }
PxRigidDynamic* CloneDynamic(PxPhysics& physicsSDK, const PxTransform& transform, const PxRigidDynamic& from, NxMirrorScene::MirrorFilter &mirrorFilter) { PxRigidDynamic* to = physicsSDK.createRigidDynamic(transform); if(!to) return NULL; if ( !copyStaticProperties(*to, from, mirrorFilter) ) { to->release(); to = NULL; return NULL; } to->setRigidDynamicFlags(from.getRigidDynamicFlags()); to->setMass(from.getMass()); to->setMassSpaceInertiaTensor(from.getMassSpaceInertiaTensor()); to->setCMassLocalPose(from.getCMassLocalPose()); if ( !(to->getRigidDynamicFlags() & PxRigidDynamicFlag::eKINEMATIC) ) { to->setLinearVelocity(from.getLinearVelocity()); to->setAngularVelocity(from.getAngularVelocity()); } to->setLinearDamping(from.getAngularDamping()); to->setAngularDamping(from.getAngularDamping()); to->setMaxAngularVelocity(from.getMaxAngularVelocity()); PxU32 posIters, velIters; from.getSolverIterationCounts(posIters, velIters); to->setSolverIterationCounts(posIters, velIters); to->setSleepThreshold(from.getSleepThreshold()); to->setContactReportThreshold(from.getContactReportThreshold()); return to; }
Entity* CreateBall(float _fRadius, SimpleTree& _rParentNode) { Entity* pBall = new Entity(EntityCategories::BALL); // The model Sphere* pSphere = new Sphere(Vector2(), _fRadius); pSphere->setColour(BALL_COLOUR); pSphere->setLevelOfDetail(10); pBall->addComponent(pSphere); pSphere->setEntity(pBall); // The physical body Body::Material material; material.density = 0.5f; material.friction = 0.5f; material.restitution = 0.5f; PhysXBody* pBody = static_cast<PhysXBody*>(PhysicsFactory::getInstance()->createBody(material, pSphere, BALL_POSITION, true)); pBall->addComponent(pBody); pBody->setEntity(pBall); // Collision detection PxRigidDynamic* pRigidDynamic = pBody->getActor()->isRigidDynamic(); PxFilterData filterData; filterData.word0 = EntityCategories::BALL; filterData.word1 = EntityCategories::WALL_BLOCK; PxShape* shapes; pRigidDynamic->getShapes(&shapes, 1); shapes->setSimulationFilterData(filterData); pRigidDynamic->setContactReportThreshold(DESTRUCTION_FORCE_THRESHOLD); // The scene SimpleTree* pNode = new SimpleTree; setTranslation(pNode->getTransformation(), BALL_POSITION); pNode->setModel(pSphere); pBody->setNode(pNode); _rParentNode.addChild(pNode); GazEngine::addEntity(pBall); return pBall; }
Entity* CreateWallBlock(const Matrix44& _rTransformation, float _fBlockSize, SimpleTree& _rParentNode) { Entity* pWallBlock = new Entity(EntityCategories::WALL_BLOCK); // The model Cube* pCube = new Cube(Vector2(), _fBlockSize); pCube->setColour(Vector4(Math::getRandomFloat(0.0f, 1.0f), Math::getRandomFloat(0.0f, 1.0f), Math::getRandomFloat(0.0f, 1.0f), 1.0f)); pWallBlock->addComponent(pCube); pCube->setEntity(pWallBlock); // The physical body Body::Material material; material.density = 0.5f; material.friction = 0.5f; material.restitution = 0.5f; PhysXBody* pBody = static_cast<PhysXBody*>(PhysicsFactory::getInstance()->createBody(material, pCube, getTranslation3(_rTransformation), true)); pWallBlock->addComponent(pBody); pBody->setEntity(pWallBlock); // Collision detection PxRigidDynamic* pRigidDynamic = pBody->getActor()->isRigidDynamic(); PxFilterData filterData; filterData.word0 = EntityCategories::WALL_BLOCK; filterData.word1 = EntityCategories::BALL | EntityCategories::WALL_BLOCK; PxShape* shapes; pRigidDynamic->getShapes(&shapes, 1); shapes->setSimulationFilterData(filterData); pRigidDynamic->setContactReportThreshold(DESTRUCTION_FORCE_THRESHOLD); // The scene SimpleTree* pNode = new SimpleTree; pNode->setTransformation(_rTransformation); pNode->setModel(pCube); pBody->setNode(pNode); _rParentNode.addChild(pNode); GazEngine::addEntity(pWallBlock); return pWallBlock; }