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;
}
示例#3
0
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;
}
示例#4
0
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;
}