Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErwin Coumans <blender@erwincoumans.com>2005-12-31 10:20:08 +0300
committerErwin Coumans <blender@erwincoumans.com>2005-12-31 10:20:08 +0300
commit9119b6e8a547303ce9a7ccd3a00636153b53cb0e (patch)
tree1816973e2baf4888d571e87cfb548cafafe46d41 /source/gameengine
parent625c553e2077ec0a252ddd934d4267c61011d61f (diff)
Fixed several bugs: python refcounting related and Bullet related (basic add/remove object support, bounding volume hierarchy). Added a few files, updated the Bullet scons. Vc6/7 Bullet projectfiles need to add a couple of files: 'Bullet/CollisionShapes/BvhTriangleMeshShape.cpp',
'Bullet/CollisionShapes/ConvexTriangleCallback.cpp', 'Bullet/CollisionShapes/EmptyShape.cpp', 'Bullet/CollisionShapes/OptimizedBvh.cpp', 'Bullet/CollisionShapes/TriangleCallback.cpp', 'Bullet/CollisionShapes/TriangleIndexVertexArray.cpp', 'Bullet/NarrowPhaseCollision/ManifoldContactAddResult.cpp'. Sorry, no armatures fix yet.
Diffstat (limited to 'source/gameengine')
-rw-r--r--source/gameengine/Converter/BL_BlenderDataConversion.cpp4
-rw-r--r--source/gameengine/Converter/BL_MeshDeformer.h8
-rw-r--r--source/gameengine/Converter/BL_SkinDeformer.cpp12
-rw-r--r--source/gameengine/Converter/BL_SkinDeformer.h11
-rw-r--r--source/gameengine/Expressions/Value.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_BulletPhysicsController.cpp79
-rw-r--r--source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp26
-rw-r--r--source/gameengine/Ketsji/KX_EmptyObject.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_EmptyObject.h2
-rw-r--r--source/gameengine/Ketsji/KX_Scene.cpp4
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsController.cpp90
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsController.h10
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp2
13 files changed, 211 insertions, 45 deletions
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
index f6136d52684..fe0cf281a1a 100644
--- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp
+++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
@@ -961,11 +961,11 @@ static KX_GameObject *gameobject_from_blenderobject(
// If this is a skin object, make Skin Controller
if (ob->parent && ob->parent->type == OB_ARMATURE && ob->partype==PARSKEL && ((Mesh*)ob->data)->dvert){
- BL_SkinDeformer *dcont = new BL_SkinDeformer(ob, (BL_SkinMeshObject*)meshobj);
+ BL_SkinDeformer *dcont = new BL_SkinDeformer(ob, (BL_SkinMeshObject*)meshobj,ob->parent);
((BL_DeformableGameObject*)gameobj)->m_pDeformer = dcont;
}
else if (((Mesh*)ob->data)->dvert){
- BL_MeshDeformer *dcont = new BL_MeshDeformer(ob, (BL_SkinMeshObject*)meshobj);
+ BL_MeshDeformer *dcont = new BL_MeshDeformer(ob, (BL_SkinMeshObject*)meshobj,ob->parent);
((BL_DeformableGameObject*)gameobj)->m_pDeformer = dcont;
}
diff --git a/source/gameengine/Converter/BL_MeshDeformer.h b/source/gameengine/Converter/BL_MeshDeformer.h
index 04e0f3b0628..c9030ceca36 100644
--- a/source/gameengine/Converter/BL_MeshDeformer.h
+++ b/source/gameengine/Converter/BL_MeshDeformer.h
@@ -48,12 +48,14 @@ public:
void VerifyStorage();
void RecalcNormals();
virtual void Relink(GEN_Map<class GEN_HashedPtr, void*>*map){};
- BL_MeshDeformer(struct Object* obj, class BL_SkinMeshObject *meshobj):
+ BL_MeshDeformer(struct Object* obj, class BL_SkinMeshObject *meshobj,struct Object* armatureObj):
m_pMeshObject(meshobj),
m_bmesh((struct Mesh*)(obj->data)),
m_transnors(NULL),
m_transverts(NULL),
- m_tvtot(0)
+ m_tvtot(0),
+ m_blenderMeshObject(obj),
+ m_blenderArmatureObj(armatureObj)
{};
virtual ~BL_MeshDeformer();
virtual void SetSimulatedTime(double time){};
@@ -67,6 +69,8 @@ protected:
MT_Point3 *m_transnors;
MT_Point3 *m_transverts;
int m_tvtot;
+ Object* m_blenderMeshObject;
+ Object* m_blenderArmatureObj;
};
diff --git a/source/gameengine/Converter/BL_SkinDeformer.cpp b/source/gameengine/Converter/BL_SkinDeformer.cpp
index ee298d70baf..84a3b8dcc5c 100644
--- a/source/gameengine/Converter/BL_SkinDeformer.cpp
+++ b/source/gameengine/Converter/BL_SkinDeformer.cpp
@@ -145,6 +145,10 @@ void BL_SkinDeformer::ProcessReplica()
{
}
+//void where_is_pose (Object *ob);
+//void armature_deform_verts(Object *armOb, Object *target, float (*vertexCos)[3], int numVerts, int deformflag);
+extern "C" void armature_deform_verts(struct Object *armOb, struct Object *target, float (*vertexCos)[3], int numVerts, int deformflag);
+
void BL_SkinDeformer::Update(void)
{
@@ -156,7 +160,8 @@ void BL_SkinDeformer::Update(void)
/* XXX note: where_is_pose() (from BKE_armature.h) calculates all matrices needed to start deforming */
/* but it requires the blender object pointer... */
-// void where_is_pose (Object *ob);
+ //void where_is_pose (Object *ob);
+ where_is_pose (m_blenderArmatureObj);
/* store verts locally */
for (int v =0; v<m_bmesh->totvert; v++){
@@ -165,6 +170,11 @@ void BL_SkinDeformer::Update(void)
m_transverts[v]=MT_Point3(m_bmesh->mvert[v].co);
}
+ float test[1000][3];
+
+ armature_deform_verts(m_blenderArmatureObj,m_blenderMeshObject,test,m_bmesh->totvert,ARM_DEF_VGROUP);
+
+
/* XXX note: now use this call instead */
// void armature_deform_verts(Object *armOb, Object *target, float (*vertexCos)[3], int numVerts, int deformflag)
// - armOb = armature object
diff --git a/source/gameengine/Converter/BL_SkinDeformer.h b/source/gameengine/Converter/BL_SkinDeformer.h
index a61ebf59b22..49c69298336 100644
--- a/source/gameengine/Converter/BL_SkinDeformer.h
+++ b/source/gameengine/Converter/BL_SkinDeformer.h
@@ -63,9 +63,10 @@ public:
m_armobj=NULL;
}
void SetArmature (class BL_ArmatureObject *armobj);
- BL_SkinDeformer( struct Object *bmeshobj,
- class BL_SkinMeshObject *mesh)
- :BL_MeshDeformer(bmeshobj, mesh),
+
+ BL_SkinDeformer( struct Object *bmeshobj,
+ class BL_SkinMeshObject *mesh,struct Object* blenderArmatureObj)
+ :BL_MeshDeformer(bmeshobj, mesh,blenderArmatureObj),
m_armobj(NULL),
m_lastUpdate(-1),
m_defbase(&bmeshobj->defbase)
@@ -85,8 +86,8 @@ public:
BL_SkinDeformer( struct Object *bmeshobj_old,
struct Object *bmeshobj_new,
- class BL_SkinMeshObject *mesh)
- :BL_MeshDeformer(bmeshobj_old, mesh),
+ class BL_SkinMeshObject *mesh,struct Object *bArmatureObj)
+ :BL_MeshDeformer(bmeshobj_old, mesh,bArmatureObj),
m_armobj(NULL),
m_lastUpdate(-1),
m_defbase(&bmeshobj_old->defbase)
diff --git a/source/gameengine/Expressions/Value.cpp b/source/gameengine/Expressions/Value.cpp
index 1a09123c107..bb9ad81f245 100644
--- a/source/gameengine/Expressions/Value.cpp
+++ b/source/gameengine/Expressions/Value.cpp
@@ -558,6 +558,10 @@ void CValue::DisableRefCount()
void CValue::AddDataToReplica(CValue *replica)
{
replica->m_refcount = 1;
+
+ //register with Python
+ _Py_NewReference(replica);
+
#ifdef _DEBUG
//gRefCountValue++;
#endif
diff --git a/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp b/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
index 5857c614e2d..7806b77257a 100644
--- a/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
+++ b/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
@@ -7,6 +7,14 @@
#include "Dynamics/RigidBody.h"
+#include "SG_Spatial.h"
+
+#include "KX_GameObject.h"
+#include "KX_MotionState.h"
+#include "KX_ClientObjectInfo.h"
+
+#include "PHY_IPhysicsEnvironment.h"
+
KX_BulletPhysicsController::KX_BulletPhysicsController (const CcdConstructionInfo& ci, bool dyna)
: KX_IPhysicsController(dyna,(PHY_IPhysicsController*)this),
CcdPhysicsController(ci)
@@ -38,6 +46,16 @@ void KX_BulletPhysicsController::applyImpulse(const MT_Point3& attach, const MT_
void KX_BulletPhysicsController::SetObject (SG_IObject* object)
{
+ SG_Controller::SetObject(object);
+
+ // cheating here...
+ //should not be necessary, is it for duplicates ?
+
+ KX_GameObject* gameobj = (KX_GameObject*) object->GetSGClientObject();
+ gameobj->SetPhysicsController(this,gameobj->IsDynamic());
+ //GetSumoObject()->setClientObject(gameobj->getClientInfo());
+
+
}
void KX_BulletPhysicsController::RelativeTranslate(const MT_Vector3& dloc,bool local)
@@ -55,22 +73,25 @@ void KX_BulletPhysicsController::RelativeRotate(const MT_Matrix3x3& drot,bool lo
void KX_BulletPhysicsController::ApplyTorque(const MT_Vector3& torque,bool local)
{
+ CcdPhysicsController::ApplyTorque(torque.x(),torque.y(),torque.z(),local);
}
void KX_BulletPhysicsController::ApplyForce(const MT_Vector3& force,bool local)
{
+ CcdPhysicsController::ApplyForce(force.x(),force.y(),force.z(),local);
}
MT_Vector3 KX_BulletPhysicsController::GetLinearVelocity()
{
- assert(0);
- return MT_Vector3(0.f,0.f,0.f);
-
+ float angVel[3];
+ CcdPhysicsController::GetAngularVelocity(angVel[0],angVel[1],angVel[2]);
+ return MT_Vector3(angVel[0],angVel[1],angVel[2]);
}
MT_Vector3 KX_BulletPhysicsController::GetVelocity(const MT_Point3& pos)
{
- assert(0);
- return MT_Vector3(0.f,0.f,0.f);
-
+ float linVel[3];
+ CcdPhysicsController::GetLinearVelocity(linVel[0],linVel[1],linVel[2]);
+ return MT_Vector3(linVel[0],linVel[1],linVel[2]);
}
+
void KX_BulletPhysicsController::SetAngularVelocity(const MT_Vector3& ang_vel,bool local)
{
CcdPhysicsController::SetAngularVelocity(ang_vel.x(),ang_vel.y(),ang_vel.z(),local);
@@ -82,16 +103,21 @@ void KX_BulletPhysicsController::SetLinearVelocity(const MT_Vector3& lin_vel,boo
}
void KX_BulletPhysicsController::getOrientation(MT_Quaternion& orn)
{
+ float myorn[4];
+ 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)
{
+ CcdPhysicsController::setOrientation(orn.x(),orn.y(),orn.z(),orn.w());
}
void KX_BulletPhysicsController::setPosition(const MT_Point3& pos)
{
-
+ CcdPhysicsController::setPosition(pos.x(),pos.y(),pos.z());
}
void KX_BulletPhysicsController::setScaling(const MT_Vector3& scaling)
{
+ CcdPhysicsController::setScaling(scaling.x(),scaling.y(),scaling.z());
}
MT_Scalar KX_BulletPhysicsController::GetMass()
{
@@ -113,6 +139,7 @@ void KX_BulletPhysicsController::setRigidBody(bool rigid)
void KX_BulletPhysicsController::SuspendDynamics()
{
+
}
void KX_BulletPhysicsController::RestoreDynamics()
{
@@ -120,8 +147,42 @@ void KX_BulletPhysicsController::RestoreDynamics()
SG_Controller* KX_BulletPhysicsController::GetReplica(class SG_Node* destnode)
{
- assert(0);
- return 0;
+ PHY_IMotionState* motionstate = new KX_MotionState(destnode);
+
+ KX_BulletPhysicsController* physicsreplica = new KX_BulletPhysicsController(*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_BulletPhysicsController*)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_BulletPhysicsController*)clientgameobj->GetPhysicsController();
+ }
+ }
+ }
+ }
+
+ physicsreplica->PostProcessReplica(motionstate,parentctrl);
+
+ return physicsreplica;
+
}
diff --git a/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp b/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
index e9a6c2442b0..646fc93dadb 100644
--- a/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
+++ b/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
@@ -673,6 +673,7 @@ void KX_ConvertODEEngineObject(KX_GameObject* gameobj,
#include "CollisionShapes/ConvexHullShape.h"
#include "CollisionShapes/TriangleMesh.h"
#include "CollisionShapes/TriangleMeshShape.h"
+#include "CollisionShapes/BvhTriangleMeshShape.h"
static GEN_Map<GEN_HashedPtr,CollisionShape*> map_gamemesh_to_bulletshape;
@@ -770,8 +771,8 @@ static CollisionShape* CreateBulletShapeFromMesh(RAS_MeshObject* meshobj, bool p
} else
{
collisionMeshData = new TriangleMesh();
- concaveShape = new TriangleMeshShape(collisionMeshData);
- collisionMeshShape = concaveShape;
+// concaveShape = new TriangleMeshShape(collisionMeshData);
+ //collisionMeshShape = concaveShape;
}
@@ -843,7 +844,20 @@ static CollisionShape* CreateBulletShapeFromMesh(RAS_MeshObject* meshobj, bool p
if (numvalidpolys > 0)
{
+
//map_gamemesh_to_bulletshape.insert(GEN_HashedPtr(meshobj),collisionMeshShape);
+ if (!polytope)
+ {
+ concaveShape = new BvhTriangleMeshShape( collisionMeshData );
+ //concaveShape = new TriangleMeshShape( collisionMeshData );
+
+ concaveShape->RecalcLocalAabb();
+ collisionMeshShape = concaveShape;
+
+ }
+
+
+
return collisionMeshShape;
}
@@ -1002,7 +1016,7 @@ void KX_ConvertBulletObject( class KX_GameObject* gameobj,
ci.m_broadphaseHandle = 0;
ci.m_friction = smmaterial->m_friction;
ci.m_restitution = smmaterial->m_restitution;
-
+ ci.m_physicsEnv = env;
// drag / damping is inverted
ci.m_linearDamping = 1.f - shapeprops->m_lin_drag;
ci.m_angularDamping = 1.f - shapeprops->m_ang_drag;
@@ -1010,7 +1024,11 @@ void KX_ConvertBulletObject( class KX_GameObject* gameobj,
KX_BulletPhysicsController* physicscontroller = new KX_BulletPhysicsController(ci,isbulletdyna);
- env->addCcdPhysicsController( physicscontroller);
+
+ if (objprop->m_in_active_layer)
+ {
+ env->addCcdPhysicsController( physicscontroller);
+ }
gameobj->SetPhysicsController(physicscontroller,isbulletdyna);
diff --git a/source/gameengine/Ketsji/KX_EmptyObject.cpp b/source/gameengine/Ketsji/KX_EmptyObject.cpp
index 8a72ba62f51..4636f2f0a3e 100644
--- a/source/gameengine/Ketsji/KX_EmptyObject.cpp
+++ b/source/gameengine/Ketsji/KX_EmptyObject.cpp
@@ -35,3 +35,7 @@
#include <config.h>
#endif
+KX_EmptyObject::~KX_EmptyObject()
+{
+
+}
diff --git a/source/gameengine/Ketsji/KX_EmptyObject.h b/source/gameengine/Ketsji/KX_EmptyObject.h
index b2038eb4816..46858b5c46d 100644
--- a/source/gameengine/Ketsji/KX_EmptyObject.h
+++ b/source/gameengine/Ketsji/KX_EmptyObject.h
@@ -39,7 +39,7 @@ public:
KX_EmptyObject(void* sgReplicationInfo,SG_Callbacks callbacks) :
KX_GameObject(sgReplicationInfo,callbacks)
{};
- virtual ~KX_EmptyObject() {};
+ virtual ~KX_EmptyObject();
};
diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp
index 6ad420375e6..f13df6bfa44 100644
--- a/source/gameengine/Ketsji/KX_Scene.cpp
+++ b/source/gameengine/Ketsji/KX_Scene.cpp
@@ -732,7 +732,7 @@ void KX_Scene::ReplaceMesh(class CValue* gameobj,void* meshobj)
Object* blendobj = (struct Object*)m_logicmgr->FindBlendObjByGameObj(newobj);
Object* oldblendobj = (struct Object*)m_logicmgr->FindBlendObjByGameMeshName(mesh->GetName());
if (blendobj->parent && blendobj->parent->type == OB_ARMATURE && blendobj->partype==PARSKEL && ((Mesh*)blendobj->data)->dvert) {
- BL_SkinDeformer* skindeformer = new BL_SkinDeformer(oldblendobj, blendobj, (BL_SkinMeshObject*)mesh);
+ BL_SkinDeformer* skindeformer = new BL_SkinDeformer(oldblendobj, blendobj, (BL_SkinMeshObject*)mesh,blendobj->parent);
skindeformer->SetArmature((BL_ArmatureObject*) newobj->GetParent());
// FIXME: should the old m_pDeformer be deleted?
@@ -741,7 +741,7 @@ void KX_Scene::ReplaceMesh(class CValue* gameobj,void* meshobj)
((BL_DeformableGameObject*)newobj)->m_pDeformer = skindeformer;
}
else if (((Mesh*)blendobj->data)->dvert) {
- BL_MeshDeformer* meshdeformer = new BL_MeshDeformer(oldblendobj, (BL_SkinMeshObject*)mesh);
+ BL_MeshDeformer* meshdeformer = new BL_MeshDeformer(oldblendobj, (BL_SkinMeshObject*)mesh,oldblendobj->parent);
// FIXME: should the old m_pDeformer be deleted?
// delete ((BL_DeformableGameObject*)newobj)->m_pDeformer
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
index d9c5575f657..bb4f1465b2d 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
@@ -4,6 +4,8 @@
#include "PHY_IMotionState.h"
#include "BroadphaseCollision/BroadphaseProxy.h"
#include "CollisionShapes/ConvexShape.h"
+#include "CcdPhysicsEnvironment.h"
+
class BP_Proxy;
@@ -20,6 +22,7 @@ float gAngularSleepingTreshold = 1.0f;
SimdVector3 startVel(0,0,0);//-10000);
CcdPhysicsController::CcdPhysicsController (const CcdConstructionInfo& ci)
+:m_cci(ci)
{
m_collisionDelay = 0;
m_newClientInfo = 0;
@@ -27,6 +30,22 @@ CcdPhysicsController::CcdPhysicsController (const CcdConstructionInfo& ci)
m_MotionState = ci.m_MotionState;
+ m_broadphaseHandle = ci.m_broadphaseHandle;
+
+ m_collisionShape = ci.m_collisionShape;
+
+ CreateRigidbody();
+
+
+ #ifdef WIN32
+ if (m_body->getInvMass())
+ m_body->setLinearVelocity(startVel);
+ #endif
+
+}
+
+void CcdPhysicsController::CreateRigidbody()
+{
SimdTransform trans;
float tmp[3];
m_MotionState->getWorldPosition(tmp[0],tmp[1],tmp[2]);
@@ -36,31 +55,19 @@ CcdPhysicsController::CcdPhysicsController (const CcdConstructionInfo& ci)
m_MotionState->getWorldOrientation(orn[0],orn[1],orn[2],orn[3]);
trans.setRotation(orn);
- MassProps mp(ci.m_mass, ci.m_localInertiaTensor);
+ MassProps mp(m_cci.m_mass, m_cci.m_localInertiaTensor);
- m_body = new RigidBody(mp,0,0,ci.m_friction,ci.m_restitution);
+ m_body = new RigidBody(mp,0,0,m_cci.m_friction,m_cci.m_restitution);
- m_broadphaseHandle = ci.m_broadphaseHandle;
-
- m_collisionShape = ci.m_collisionShape;
-
//
// init the rigidbody properly
//
- m_body->setMassProps(ci.m_mass, ci.m_localInertiaTensor);
- m_body->setGravity( ci.m_gravity);
-
-
- m_body->setDamping(ci.m_linearDamping, ci.m_angularDamping);
-
-
+ m_body->setMassProps(m_cci.m_mass, m_cci.m_localInertiaTensor);
+ m_body->setGravity( m_cci.m_gravity);
+ m_body->setDamping(m_cci.m_linearDamping, m_cci.m_angularDamping);
m_body->setCenterOfMassTransform( trans );
- #ifdef WIN32
- if (m_body->getInvMass())
- m_body->setLinearVelocity(startVel);
- #endif
}
@@ -68,6 +75,7 @@ CcdPhysicsController::~CcdPhysicsController()
{
//will be reference counted, due to sharing
//delete m_collisionShape;
+ m_cci.m_physicsEnv->removeCcdPhysicsController(this);
delete m_MotionState;
delete m_body;
}
@@ -109,6 +117,45 @@ void CcdPhysicsController::WriteDynamicsToMotionState()
// controller replication
void CcdPhysicsController::PostProcessReplica(class PHY_IMotionState* motionstate,class PHY_IPhysicsController* parentctrl)
{
+
+ m_MotionState = motionstate;
+ m_broadphaseHandle = 0;
+ m_body = 0;
+ CreateRigidbody();
+
+ m_cci.m_physicsEnv->addCcdPhysicsController(this);
+
+
+/* SM_Object* dynaparent=0;
+ SumoPhysicsController* sumoparentctrl = (SumoPhysicsController* )parentctrl;
+
+ if (sumoparentctrl)
+ {
+ dynaparent = sumoparentctrl->GetSumoObject();
+ }
+
+ SM_Object* orgsumoobject = m_sumoObj;
+
+
+ m_sumoObj = new SM_Object(
+ orgsumoobject->getShapeHandle(),
+ orgsumoobject->getMaterialProps(),
+ orgsumoobject->getShapeProps(),
+ dynaparent);
+
+ m_sumoObj->setRigidBody(orgsumoobject->isRigidBody());
+
+ m_sumoObj->setMargin(orgsumoobject->getMargin());
+ m_sumoObj->setPosition(orgsumoobject->getPosition());
+ m_sumoObj->setOrientation(orgsumoobject->getOrientation());
+ //if it is a dyna, register for a callback
+ m_sumoObj->registerCallback(*this);
+
+ m_sumoScene->add(* (m_sumoObj));
+ */
+
+
+
}
// kinematic methods
@@ -269,6 +316,15 @@ void CcdPhysicsController::GetLinearVelocity(float& linvX,float& linvY,float& l
linvZ = linvel.z();
}
+
+void CcdPhysicsController::GetAngularVelocity(float& angVelX,float& angVelY,float& angVelZ)
+{
+ const SimdVector3& angvel= m_body->getAngularVelocity();
+ angVelX = angvel.x();
+ angVelY = angvel.y();
+ angVelZ = angvel.z();
+}
+
void CcdPhysicsController::GetVelocity(const float posX,const float posY,const float posZ,float& linvX,float& linvY,float& linvZ)
{
SimdVector3 pos(posX,posY,posZ);
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.h b/source/gameengine/Physics/Bullet/CcdPhysicsController.h
index 4f189b7f324..87290f65fb4 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsController.h
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.h
@@ -16,6 +16,7 @@ extern float gDeactivationTime;
extern float gLinearSleepingTreshold;
extern float gAngularSleepingTreshold;
extern bool gDisableDeactivation;
+class CcdPhysicsEnvironment;
struct CcdConstructionInfo
@@ -27,7 +28,8 @@ struct CcdConstructionInfo
m_linearDamping(0.1f),
m_angularDamping(0.1f),
m_MotionState(0),
- m_collisionShape(0)
+ m_collisionShape(0),
+ m_physicsEnv(0)
{
}
@@ -42,7 +44,7 @@ struct CcdConstructionInfo
class PHY_IMotionState* m_MotionState;
CollisionShape* m_collisionShape;
-
+ CcdPhysicsEnvironment* m_physicsEnv; //needed for self-replication
};
@@ -56,8 +58,11 @@ class CcdPhysicsController : public PHY_IPhysicsController
CollisionShape* m_collisionShape;
void* m_newClientInfo;
+ CcdConstructionInfo m_cci;//needed for replication
void GetWorldOrientation(SimdMatrix3x3& mat);
+ void CreateRigidbody();
+
public:
int m_collisionDelay;
@@ -110,6 +115,7 @@ class CcdPhysicsController : public PHY_IPhysicsController
// reading out information from physics
virtual void GetLinearVelocity(float& linvX,float& linvY,float& linvZ);
+ virtual void GetAngularVelocity(float& angVelX,float& angVelY,float& angVelZ);
virtual void GetVelocity(const float posX,const float posY,const float posZ,float& linvX,float& linvY,float& linvZ);
virtual void getReactionForce(float& forceX,float& forceY,float& forceZ);
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
index c375abbdb16..3a500a833c8 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
@@ -226,11 +226,13 @@ void CcdPhysicsEnvironment::removeCcdPhysicsController(CcdPhysicsController* ctr
if (removeFromBroadphase)
{
+
}
//
// only clear the cached algorithms
//
scene->CleanProxyFromPairs(bp);
+ scene->DestroyProxy(bp);//??
}
{
std::vector<CcdPhysicsController*>::iterator i =