Brought back the sumo physics controllers and undid game engine make file

changes.
Instead modified the top level nan_definitions.mk to point the NAN_SUMO and
NAN_FUZZICS to the right locations.
Maarten
This commit is contained in:
Maarten Gribnau 2002-11-05 20:20:50 +00:00
parent 7c59c12dc0
commit 2d5514be28
4 changed files with 290 additions and 3 deletions

@ -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()
{
}

@ -0,0 +1,83 @@
#ifndef __KX_SUMOPHYSICSCONTROLLER_H
#define __KX_SUMOPHYSICSCONTROLLER_H
#include "PHY_IPhysicsController.h"
#include "SM_Object.h" // for SM_Callback
/**
Physics Controller, a special kind of Scene Graph Transformation Controller.
It get's callbacks from Sumo in case a transformation change took place.
Each time the scene graph get's updated, the controller get's a chance
in the 'Update' method to reflect changed.
*/
#include "SumoPhysicsController.h"
#include "KX_IPhysicsController.h"
class KX_SumoPhysicsController : public KX_IPhysicsController,
public SumoPhysicsController
{
public:
KX_SumoPhysicsController(
class SM_Scene* sumoScene,
DT_SceneHandle solidscene,
class SM_Object* sumoObj,
class PHY_IMotionState* motionstate
,bool dyna)
: SumoPhysicsController(sumoScene,solidscene,sumoObj,motionstate,dyna),
KX_IPhysicsController(dyna,NULL)
{
};
virtual ~KX_SumoPhysicsController();
void applyImpulse(const MT_Point3& attach, const MT_Vector3& impulse);
virtual void SetObject (SG_IObject* object);
void RelativeTranslate(const MT_Vector3& dloc,bool local);
void RelativeRotate(const MT_Matrix3x3& drot,bool local);
void ApplyTorque(const MT_Vector3& torque,bool local);
void ApplyForce(const MT_Vector3& force,bool local);
MT_Vector3 GetLinearVelocity();
MT_Vector3 GetVelocity(const MT_Point3& pos);
void SetAngularVelocity(const MT_Vector3& ang_vel,bool local);
void SetLinearVelocity(const MT_Vector3& lin_vel,bool local);
void SuspendDynamics();
void RestoreDynamics();
virtual void getOrientation(MT_Quaternion& orn);
virtual void setOrientation(const MT_Quaternion& orn);
virtual void setPosition(const MT_Point3& pos);
virtual void setScaling(const MT_Vector3& scaling);
virtual MT_Scalar GetMass();
virtual MT_Vector3 getReactionForce();
virtual void setRigidBody(bool rigid);
virtual SG_Controller* GetReplica(class SG_Node* destnode);
void SetSumoTransform(bool nondynaonly);
// todo: remove next line !
virtual void SetSimulatedTime(double time);
// call from scene graph to update
virtual bool Update(double time);
void
SetOption(
int option,
int value
){
// intentionally empty
};
};
#endif //__KX_SUMOPHYSICSCONTROLLER_H

@ -35,6 +35,6 @@ include nan_definitions.mk
SOURCEDIR = source/gameengine/Physics
DIR = $(OCGDIR)/gameengine/blphys
DIRS = common Dummy BlOde
DIRS = common Sumo Dummy BlOde
include nan_subdirs.mk

@ -55,8 +55,8 @@ all debug::
export NAN_MESA ?= /usr/src/Mesa-3.1
export NAN_MOTO ?= $(LCGDIR)/moto
export NAN_SOLID ?= $(SRCHOME)/sumo/SOLID-3.0
export NAN_SUMO ?= $(SRCHOME)/sumo
export NAN_FUZZICS ?= $(SRCHOME)/sumo/Fuzzics
export NAN_SUMO ?= $(SRCHOME)/gameengine/Physics/Sumo
export NAN_FUZZICS ?= $(SRCHOME)/gameengine/Physics/Sumo/Fuzzics
export NAN_ODE ?= $(SRCHOME)/ode
export NAN_OPENSSL ?= $(LCGDIR)/openssl
export NAN_BLENKEY ?= $(LCGDIR)/blenkey