forked from bartvdbraak/blender
BGE patch: Optimization of bullet adaptation layer - part 1.
First batch of optimizaton of the bullet adaptation layer in the BGE. - remove circular motion state update. - optimization of physic adaptation layer for bullet: bypass unecessary conversion of rotation matrix to quaternion and back. - remove double updates during object replication.
This commit is contained in:
parent
8f17a66036
commit
4ae4ecd3ce
@ -133,9 +133,10 @@ void KX_BulletPhysicsController::getOrientation(MT_Quaternion& orn)
|
||||
CcdPhysicsController::getOrientation(myorn[0],myorn[1],myorn[2],myorn[3]);
|
||||
orn = MT_Quaternion(myorn[0],myorn[1],myorn[2],myorn[3]);
|
||||
}
|
||||
void KX_BulletPhysicsController::setOrientation(const MT_Quaternion& orn)
|
||||
void KX_BulletPhysicsController::setOrientation(const MT_Matrix3x3& orn)
|
||||
{
|
||||
CcdPhysicsController::setOrientation(orn.x(),orn.y(),orn.z(),orn.w());
|
||||
btMatrix3x3 btmat(orn[0][0], orn[0][1], orn[1][2], orn[1][0], orn[1][1], orn[1][2], orn[2][0], orn[2][1], orn[2][2]);
|
||||
CcdPhysicsController::setWorldOrientation(btmat);
|
||||
}
|
||||
void KX_BulletPhysicsController::setPosition(const MT_Point3& pos)
|
||||
{
|
||||
|
@ -35,7 +35,7 @@ public:
|
||||
virtual void SetAngularVelocity(const MT_Vector3& ang_vel,bool local);
|
||||
virtual void SetLinearVelocity(const MT_Vector3& lin_vel,bool local);
|
||||
virtual void getOrientation(MT_Quaternion& orn);
|
||||
virtual void setOrientation(const MT_Quaternion& orn);
|
||||
virtual void setOrientation(const MT_Matrix3x3& orn);
|
||||
virtual void setPosition(const MT_Point3& pos);
|
||||
virtual void setScaling(const MT_Vector3& scaling);
|
||||
virtual MT_Scalar GetMass();
|
||||
|
@ -744,7 +744,7 @@ void KX_GameObject::NodeSetLocalOrientation(const MT_Matrix3x3& rot)
|
||||
if (m_pPhysicsController1 && (!GetSGNode() || !GetSGNode()->GetSGParent()))
|
||||
{
|
||||
// see note above
|
||||
m_pPhysicsController1->setOrientation(rot.getRotation());
|
||||
m_pPhysicsController1->setOrientation(rot);
|
||||
}
|
||||
if (GetSGNode())
|
||||
GetSGNode()->SetLocalOrientation(rot);
|
||||
|
@ -71,7 +71,8 @@ public:
|
||||
virtual void resolveCombinedVelocities(float linvelX,float linvelY,float linvelZ,float angVelX,float angVelY,float angVelZ) = 0;
|
||||
|
||||
virtual void getOrientation(MT_Quaternion& orn)=0;
|
||||
virtual void setOrientation(const MT_Quaternion& orn)=0;
|
||||
virtual void setOrientation(const MT_Matrix3x3& orn)=0;
|
||||
//virtual void setOrientation(const MT_Quaternion& orn)=0;
|
||||
virtual void setPosition(const MT_Point3& pos)=0;
|
||||
virtual void setScaling(const MT_Vector3& scaling)=0;
|
||||
virtual MT_Scalar GetMass()=0;
|
||||
|
@ -133,8 +133,9 @@ void KX_OdePhysicsController::SetLinearVelocity(const MT_Vector3& lin_vel,bool l
|
||||
ODEPhysicsController::SetLinearVelocity(lin_vel[0],lin_vel[1],lin_vel[2],local);
|
||||
}
|
||||
|
||||
void KX_OdePhysicsController::setOrientation(const MT_Quaternion& orn)
|
||||
void KX_OdePhysicsController::setOrientation(const MT_Matrix3x3& rot)
|
||||
{
|
||||
MT_Quaternion orn = rot.getRotation();
|
||||
ODEPhysicsController::setOrientation(orn[0],orn[1],orn[2],orn[3]);
|
||||
}
|
||||
|
||||
|
@ -67,7 +67,7 @@ public:
|
||||
virtual void SetLinearVelocity(const MT_Vector3& lin_vel,bool local);
|
||||
virtual void resolveCombinedVelocities(float linvelX,float linvelY,float linvelZ,float angVelX,float angVelY,float angVelZ);
|
||||
virtual void getOrientation(MT_Quaternion& orn);
|
||||
virtual void setOrientation(const MT_Quaternion& orn);
|
||||
virtual void setOrientation(const MT_Matrix3x3& orn);
|
||||
virtual void setPosition(const MT_Point3& pos);
|
||||
virtual void setScaling(const MT_Vector3& scaling);
|
||||
virtual MT_Scalar GetMass();
|
||||
|
@ -176,8 +176,10 @@ void KX_RadarSensor::SynchronizeTransform()
|
||||
|
||||
if (m_physCtrl)
|
||||
{
|
||||
m_physCtrl->setPosition(trans.getOrigin().x(),trans.getOrigin().y(),trans.getOrigin().z());
|
||||
m_physCtrl->setOrientation(trans.getRotation().x(),trans.getRotation().y(),trans.getRotation().z(),trans.getRotation().w());
|
||||
MT_Quaternion orn = trans.getRotation();
|
||||
MT_Point3 pos = trans.getOrigin();
|
||||
m_physCtrl->setPosition(pos[0],pos[1],pos[2]);
|
||||
m_physCtrl->setOrientation(orn[0],orn[1],orn[2],orn[3]);
|
||||
m_physCtrl->calcXform();
|
||||
}
|
||||
|
||||
|
@ -712,8 +712,12 @@ void KX_Scene::DupliGroupRecurse(CValue* obj, int level)
|
||||
|
||||
if (replica->GetPhysicsController())
|
||||
{
|
||||
replica->GetPhysicsController()->setPosition(newpos);
|
||||
replica->GetPhysicsController()->setOrientation(newori.getRotation());
|
||||
// not required, already done in NodeSetLocalOrientation..
|
||||
//replica->GetPhysicsController()->setPosition(newpos);
|
||||
//replica->GetPhysicsController()->setOrientation(newori.getRotation());
|
||||
// Scaling has been set relatively hereabove, this does not
|
||||
// set the scaling of the controller. I don't know why it's just the
|
||||
// relative scale and not the full scale that has to be put here...
|
||||
replica->GetPhysicsController()->setScaling(newscale);
|
||||
}
|
||||
|
||||
@ -843,8 +847,9 @@ SCA_IObject* KX_Scene::AddReplicaObject(class CValue* originalobject,
|
||||
|
||||
if (replica->GetPhysicsController())
|
||||
{
|
||||
replica->GetPhysicsController()->setPosition(newpos);
|
||||
replica->GetPhysicsController()->setOrientation(newori.getRotation());
|
||||
// not needed, already done in NodeSetLocalPosition()
|
||||
//replica->GetPhysicsController()->setPosition(newpos);
|
||||
//replica->GetPhysicsController()->setOrientation(newori.getRotation());
|
||||
replica->GetPhysicsController()->setScaling(newscale);
|
||||
}
|
||||
|
||||
|
@ -170,8 +170,9 @@ void KX_SumoPhysicsController::setMargin(float collisionMargin)
|
||||
}
|
||||
|
||||
|
||||
void KX_SumoPhysicsController::setOrientation(const MT_Quaternion& orn)
|
||||
void KX_SumoPhysicsController::setOrientation(const MT_Matrix3x3& rot)
|
||||
{
|
||||
MT_Quaternion orn = rot.getRotation();
|
||||
SumoPhysicsController::setOrientation(
|
||||
orn[0],orn[1],orn[2],orn[3]);
|
||||
|
||||
|
@ -79,7 +79,7 @@ public:
|
||||
void SuspendDynamics(bool);
|
||||
void RestoreDynamics();
|
||||
virtual void getOrientation(MT_Quaternion& orn);
|
||||
virtual void setOrientation(const MT_Quaternion& orn);
|
||||
virtual void setOrientation(const MT_Matrix3x3& orn);
|
||||
|
||||
virtual void setPosition(const MT_Point3& pos);
|
||||
virtual void setScaling(const MT_Vector3& scaling);
|
||||
|
@ -337,12 +337,33 @@ void CcdPhysicsController::setOrientation(float quatImag0,float quatImag1,float
|
||||
{
|
||||
m_body->setCollisionFlags(m_body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
|
||||
}
|
||||
|
||||
m_MotionState->setWorldOrientation(quatImag0,quatImag1,quatImag2,quatReal);
|
||||
// not required
|
||||
//m_MotionState->setWorldOrientation(quatImag0,quatImag1,quatImag2,quatReal);
|
||||
btTransform xform = m_body->getCenterOfMassTransform();
|
||||
xform.setRotation(btQuaternion(quatImag0,quatImag1,quatImag2,quatReal));
|
||||
m_body->setCenterOfMassTransform(xform);
|
||||
m_bulletMotionState->setWorldTransform(xform);
|
||||
// not required
|
||||
//m_bulletMotionState->setWorldTransform(xform);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void CcdPhysicsController::setWorldOrientation(const btMatrix3x3& orn)
|
||||
{
|
||||
if (m_body)
|
||||
{
|
||||
m_body->activate(true);
|
||||
if (m_body->isStaticObject())
|
||||
{
|
||||
m_body->setCollisionFlags(m_body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
|
||||
}
|
||||
// not required
|
||||
//m_MotionState->setWorldOrientation(quatImag0,quatImag1,quatImag2,quatReal);
|
||||
btTransform xform = m_body->getCenterOfMassTransform();
|
||||
xform.setBasis(orn);
|
||||
m_body->setCenterOfMassTransform(xform);
|
||||
// not required
|
||||
//m_bulletMotionState->setWorldTransform(xform);
|
||||
}
|
||||
|
||||
}
|
||||
@ -356,12 +377,13 @@ void CcdPhysicsController::setPosition(float posX,float posY,float posZ)
|
||||
{
|
||||
m_body->setCollisionFlags(m_body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
|
||||
}
|
||||
|
||||
m_MotionState->setWorldPosition(posX,posY,posZ);
|
||||
// not required, this function is only used to update the physic controller
|
||||
//m_MotionState->setWorldPosition(posX,posY,posZ);
|
||||
btTransform xform = m_body->getCenterOfMassTransform();
|
||||
xform.setOrigin(btVector3(posX,posY,posZ));
|
||||
m_body->setCenterOfMassTransform(xform);
|
||||
m_bulletMotionState->setWorldTransform(xform);
|
||||
// not required
|
||||
//m_bulletMotionState->setWorldTransform(xform);
|
||||
}
|
||||
|
||||
|
||||
|
@ -116,6 +116,9 @@ class CcdPhysicsController : public PHY_IPhysicsController
|
||||
|
||||
void CreateRigidbody();
|
||||
|
||||
protected:
|
||||
void setWorldOrientation(const btMatrix3x3& mat);
|
||||
|
||||
public:
|
||||
|
||||
int m_collisionDelay;
|
||||
|
Loading…
Reference in New Issue
Block a user