diff options
author | Hans Lambermont <hans@lambermont.dyndns.org> | 2002-10-12 15:37:38 +0400 |
---|---|---|
committer | Hans Lambermont <hans@lambermont.dyndns.org> | 2002-10-12 15:37:38 +0400 |
commit | 12315f4d0e0ae993805f141f64cb8c73c5297311 (patch) | |
tree | 59b45827cd8293cfb727758989c7a74b40183974 /source/gameengine/Ketsji/KX_SumoPhysicsController.cpp |
Initial revisionv2.25
Diffstat (limited to 'source/gameengine/Ketsji/KX_SumoPhysicsController.cpp')
-rw-r--r-- | source/gameengine/Ketsji/KX_SumoPhysicsController.cpp | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/source/gameengine/Ketsji/KX_SumoPhysicsController.cpp b/source/gameengine/Ketsji/KX_SumoPhysicsController.cpp new file mode 100644 index 00000000000..8b5b9a5d10b --- /dev/null +++ b/source/gameengine/Ketsji/KX_SumoPhysicsController.cpp @@ -0,0 +1,204 @@ +#pragma warning (disable : 4786) + +#include "KX_SumoPhysicsController.h" +#include "SG_Spatial.h" +#include "SM_Scene.h" +#include "KX_GameObject.h" +#include "KX_MotionState.h" + + + +void KX_SumoPhysicsController::applyImpulse(const MT_Point3& attach, const MT_Vector3& impulse) +{ + SumoPhysicsController::applyImpulse(attach[0],attach[1],attach[2],impulse[0],impulse[1],impulse[2]); +} +void KX_SumoPhysicsController::RelativeTranslate(const MT_Vector3& dloc,bool local) +{ + SumoPhysicsController::RelativeTranslate(dloc[0],dloc[1],dloc[2],local); + +} +void KX_SumoPhysicsController::RelativeRotate(const MT_Matrix3x3& drot,bool local) +{ + double oldmat[12]; + drot.getValue(oldmat); + float newmat[9]; + float *m = &newmat[0]; + double *orgm = &oldmat[0]; + + *m++ = *orgm++;*m++ = *orgm++;*m++ = *orgm++;orgm++; + *m++ = *orgm++;*m++ = *orgm++;*m++ = *orgm++;orgm++; + *m++ = *orgm++;*m++ = *orgm++;*m++ = *orgm++;orgm++; + + SumoPhysicsController::RelativeRotate(newmat,local); +} + +void KX_SumoPhysicsController::SetLinearVelocity(const MT_Vector3& lin_vel,bool local) +{ + SumoPhysicsController::SetLinearVelocity(lin_vel[0],lin_vel[1],lin_vel[2],local); + +} + +void KX_SumoPhysicsController::SetAngularVelocity(const MT_Vector3& ang_vel,bool local) +{ + SumoPhysicsController::SetAngularVelocity(ang_vel[0],ang_vel[1],ang_vel[2],local); +} + +MT_Vector3 KX_SumoPhysicsController::GetVelocity(const MT_Point3& pos) +{ + + float linvel[3]; + SumoPhysicsController::GetVelocity(pos[0],pos[1],pos[2],linvel[0],linvel[1],linvel[2]); + + return MT_Vector3 (linvel); +} + +MT_Vector3 KX_SumoPhysicsController::GetLinearVelocity() +{ + return GetVelocity(MT_Point3(0,0,0)); + +} +void KX_SumoPhysicsController::ApplyTorque(const MT_Vector3& torque,bool local) +{ + SumoPhysicsController::ApplyTorque(torque[0],torque[1],torque[2],local); + +} + +void KX_SumoPhysicsController::ApplyForce(const MT_Vector3& force,bool local) +{ + SumoPhysicsController::ApplyForce(force[0],force[1],force[2],local); +} + +bool KX_SumoPhysicsController::Update(double time) +{ + return SynchronizeMotionStates(time); + +} + +void KX_SumoPhysicsController::SetSimulatedTime(double time) +{ + +} + +void KX_SumoPhysicsController::SetSumoTransform(bool nondynaonly) +{ + SumoPhysicsController::setSumoTransform(nondynaonly); + +} + +void KX_SumoPhysicsController::SuspendDynamics() +{ + SumoPhysicsController::SuspendDynamics(); +} + +void KX_SumoPhysicsController::RestoreDynamics() +{ + SumoPhysicsController::RestoreDynamics(); +} + +SG_Controller* KX_SumoPhysicsController::GetReplica(SG_Node* destnode) +{ + + PHY_IMotionState* motionstate = new KX_MotionState(destnode); + + KX_SumoPhysicsController* physicsreplica = new KX_SumoPhysicsController(*this); + + //parentcontroller is here be able to avoid collisions between parent/child + + PHY_IPhysicsController* parentctrl = NULL; + + if (destnode != destnode->GetRootSGParent()) + { + KX_GameObject* clientgameobj = (KX_GameObject*) destnode->GetRootSGParent()->GetSGClientObject(); + if (clientgameobj) + { + parentctrl = (KX_SumoPhysicsController*)clientgameobj->GetPhysicsController(); + } else + { + // it could be a false node, try the children + NodeList::const_iterator childit; + for ( + childit = destnode->GetSGChildren().begin(); + childit!= destnode->GetSGChildren().end(); + ++childit + ) { + KX_GameObject* clientgameobj = static_cast<KX_GameObject*>( (*childit)->GetSGClientObject()); + if (clientgameobj) + { + parentctrl = (KX_SumoPhysicsController*)clientgameobj->GetPhysicsController(); + } + } + } + } + + physicsreplica->PostProcessReplica(motionstate,parentctrl); + + return physicsreplica; +} + + +void KX_SumoPhysicsController::SetObject (SG_IObject* object) +{ + SG_Controller::SetObject(object); + + // cheating here... + KX_GameObject* gameobj = (KX_GameObject*) object->GetSGClientObject(); + gameobj->SetPhysicsController(this); + + +} + + +void KX_SumoPhysicsController::setOrientation(const MT_Quaternion& orn) +{ + SumoPhysicsController::setOrientation( + orn[0],orn[1],orn[2],orn[3]); + +} +void KX_SumoPhysicsController::getOrientation(MT_Quaternion& orn) +{ + + float quat[4]; + + SumoPhysicsController::getOrientation(quat[0],quat[1],quat[2],quat[3]); + + orn = MT_Quaternion(quat); + +} + +void KX_SumoPhysicsController::setPosition(const MT_Point3& pos) +{ + SumoPhysicsController::setPosition(pos[0],pos[1],pos[2]); + +} + +void KX_SumoPhysicsController::setScaling(const MT_Vector3& scaling) +{ + SumoPhysicsController::setScaling(scaling[0],scaling[1],scaling[2]); + +} + +MT_Scalar KX_SumoPhysicsController::GetMass() +{ + return SumoPhysicsController::getMass(); +} + +MT_Vector3 KX_SumoPhysicsController::getReactionForce() +{ + float force[3]; + SumoPhysicsController::getReactionForce(force[0],force[1],force[2]); + return MT_Vector3(force); + +} + +void KX_SumoPhysicsController::setRigidBody(bool rigid) +{ + SumoPhysicsController::setRigidBody(rigid); + +} + + +KX_SumoPhysicsController::~KX_SumoPhysicsController() +{ + + +}
\ No newline at end of file |