diff options
author | Erwin Coumans <blender@erwincoumans.com> | 2006-05-23 01:03:43 +0400 |
---|---|---|
committer | Erwin Coumans <blender@erwincoumans.com> | 2006-05-23 01:03:43 +0400 |
commit | ab71e2a9b55e0982d1134792d10af55464c7ac9e (patch) | |
tree | 4a53791a67d3234360107a33c5365d4de4844bb7 /source/gameengine/Ketsji | |
parent | 677cf7f1333c634a52227a15d6dcb3351b39febc (diff) |
-added basic support for GameActuator 'load game', relative paths were broken, just load file into memory and load blend from memory.
-near sensor support
- python binding for PhysicsConstraints.setNumTimeSubSteps (dividing the physics timestep to tradeoff quality for performance)
Diffstat (limited to 'source/gameengine/Ketsji')
-rw-r--r-- | source/gameengine/Ketsji/KX_NearSensor.cpp | 31 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_PyConstraintBinding.cpp | 24 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp | 4 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_Scene.cpp | 22 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_Scene.h | 8 |
5 files changed, 84 insertions, 5 deletions
diff --git a/source/gameengine/Ketsji/KX_NearSensor.cpp b/source/gameengine/Ketsji/KX_NearSensor.cpp index 5c6f038e23d..fac2302b85e 100644 --- a/source/gameengine/Ketsji/KX_NearSensor.cpp +++ b/source/gameengine/Ketsji/KX_NearSensor.cpp @@ -80,7 +80,10 @@ KX_NearSensor::KX_NearSensor(SCA_EventManager* eventmgr, void KX_NearSensor::RegisterSumo(KX_TouchEventManager *touchman) { - touchman->GetPhysicsEnvironment()->addSensor(m_physCtrl); + if (m_physCtrl) + { + touchman->GetPhysicsEnvironment()->addSensor(m_physCtrl); + } } CValue* KX_NearSensor::GetReplica() @@ -96,7 +99,18 @@ CValue* KX_NearSensor::GetReplica() replica->m_client_info = new KX_ClientObjectInfo(m_client_info->m_gameobject, KX_ClientObjectInfo::NEAR); - replica->m_physCtrl = replica->m_physCtrl->GetReplica(); + if (replica->m_physCtrl) + { + replica->m_physCtrl = replica->m_physCtrl->GetReplica(); + if (replica->m_physCtrl) + { + //static_cast<KX_TouchEventManager*>(m_eventmgr)->GetPhysicsEnvironment()->addSensor(replica->m_physCtrl); + replica->m_physCtrl->SetMargin(m_Margin); + replica->m_physCtrl->setNewClientInfo(replica->m_client_info); + } + + } + //static_cast<KX_TouchEventManager*>(m_eventmgr)->RegisterSensor(this); //todo: make sure replication works fine //>m_sumoObj = new SM_Object(DT_NewSphere(0.0),NULL,NULL,NULL); //replica->m_sumoObj->setMargin(m_Margin); @@ -111,11 +125,21 @@ CValue* KX_NearSensor::GetReplica() void KX_NearSensor::ReParent(SCA_IObject* parent) { + SCA_ISensor::ReParent(parent); m_client_info->m_gameobject = static_cast<KX_GameObject*>(parent); m_client_info->m_sensors.push_back(this); + +/* KX_ClientObjectInfo *client_info = gameobj->getClientInfo(); + client_info->m_gameobject = gameobj; + client_info->m_auxilary_info = NULL; + + client_info->m_sensors.push_back(this); + SCA_ISensor::ReParent(parent); +*/ + SynchronizeTransform(); } @@ -127,10 +151,11 @@ KX_NearSensor::~KX_NearSensor() // for touchsensor, it's the parent if (m_physCtrl) { - static_cast<KX_TouchEventManager*>(m_eventmgr)->GetPhysicsEnvironment()->removeSensor(m_physCtrl); + //static_cast<KX_TouchEventManager*>(m_eventmgr)->GetPhysicsEnvironment()->removeSensor(m_physCtrl); delete m_physCtrl; m_physCtrl = NULL; } + if (m_client_info) delete m_client_info; diff --git a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp index e9c71fe02c9..28138195a5e 100644 --- a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp +++ b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp @@ -53,6 +53,9 @@ static char gPySetGravity__doc__[] = "setGravity(float x,float y,float z)"; static char gPySetDebugMode__doc__[] = "setDebugMode(int mode)"; static char gPySetNumIterations__doc__[] = "setNumIterations(int numiter) This sets the number of iterations for an iterative constraint solver"; +static char gPySetNumTimeSubSteps__doc__[] = "setNumTimeSubSteps(int numsubstep) This sets the number of substeps for each physics proceed. Tradeoff quality for performance."; + + static char gPySetDeactivationTime__doc__[] = "setDeactivationTime(float time) This sets the time after which a resting rigidbody gets deactived"; static char gPySetDeactivationLinearTreshold__doc__[] = "setDeactivationLinearTreshold(float linearTreshold)"; static char gPySetDeactivationAngularTreshold__doc__[] = "setDeactivationAngularTreshold(float angularTreshold)"; @@ -106,6 +109,24 @@ static PyObject* gPySetDebugMode(PyObject* self, Py_INCREF(Py_None); return Py_None; } + + +static PyObject* gPySetNumTimeSubSteps(PyObject* self, + PyObject* args, + PyObject* kwds) +{ + int substep; + if (PyArg_ParseTuple(args,"i",&substep)) + { + if (PHY_GetActiveEnvironment()) + { + PHY_GetActiveEnvironment()->setNumTimeSubSteps(substep); + } + } + Py_INCREF(Py_None); return Py_None; +} + + static PyObject* gPySetNumIterations(PyObject* self, PyObject* args, PyObject* kwds) @@ -411,6 +432,9 @@ static struct PyMethodDef physicsconstraints_methods[] = { {"setNumIterations",(PyCFunction) gPySetNumIterations, METH_VARARGS, gPySetNumIterations__doc__}, + {"setNumTimeSubSteps",(PyCFunction) gPySetNumTimeSubSteps, + METH_VARARGS, gPySetNumTimeSubSteps__doc__}, + {"setDeactivationTime",(PyCFunction) gPySetDeactivationTime, METH_VARARGS, gPySetDeactivationTime__doc__}, diff --git a/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp b/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp index 322f41e11a3..45b2db10b33 100644 --- a/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp +++ b/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp @@ -318,7 +318,11 @@ void KX_SCA_AddObjectActuator::InstantAddObject() // keep a copy of the last object, to allow python scripters to change it if (m_lastCreatedObject) + { + //careful with destruction, it might still have outstanding collision callbacks + m_scene->DelayedReleaseObject(m_lastCreatedObject); m_lastCreatedObject->Release(); + } m_lastCreatedObject = replica; m_lastCreatedObject->AddRef(); diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index 1706937f8df..a5bbfa41e3e 100644 --- a/source/gameengine/Ketsji/KX_Scene.cpp +++ b/source/gameengine/Ketsji/KX_Scene.cpp @@ -125,6 +125,7 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice, m_parentlist = new CListValue(); m_lightlist= new CListValue(); m_euthanasyobjects = new CListValue(); + m_delayReleaseObjects = new CListValue(); m_logicmgr = new SCA_LogicManager(); @@ -193,6 +194,8 @@ KX_Scene::~KX_Scene() if (m_euthanasyobjects) m_euthanasyobjects->Release(); + if (m_delayReleaseObjects) + m_delayReleaseObjects->Release(); if (m_logicmgr) delete m_logicmgr; @@ -654,8 +657,13 @@ void KX_Scene::RemoveObject(class CValue* gameobj) // recursively destruct node->Destruct(); } + newobj->SetSGNode(0); } +void KX_Scene::DelayedReleaseObject(CValue* gameobj) +{ + m_delayReleaseObjects->Add(gameobj->AddRef()); +} void KX_Scene::DelayedRemoveObject(class CValue* gameobj) @@ -1087,12 +1095,22 @@ void KX_Scene::LogicEndFrame() { m_logicmgr->EndFrame(); int numobj = m_euthanasyobjects->GetCount(); - - for (int i = numobj - 1; i >= 0; i--) + int i; + for (i = numobj - 1; i >= 0; i--) { KX_GameObject* gameobj = (KX_GameObject*)m_euthanasyobjects->GetValue(i); this->RemoveObject(gameobj); } + + numobj= m_delayReleaseObjects->GetCount(); + for (i = numobj-1;i>=0;i--) + { + KX_GameObject* gameobj = (KX_GameObject*)m_delayReleaseObjects->GetValue(i); + m_delayReleaseObjects->RemoveValue(gameobj); + + } + + } diff --git a/source/gameengine/Ketsji/KX_Scene.h b/source/gameengine/Ketsji/KX_Scene.h index 4bcfb3ee194..ba479c5e543 100644 --- a/source/gameengine/Ketsji/KX_Scene.h +++ b/source/gameengine/Ketsji/KX_Scene.h @@ -101,6 +101,11 @@ protected: * LogicEndFrame() via a call to RemoveObject(). */ CListValue* m_euthanasyobjects; + /** + * The list of objects that couldn't be released during logic update. + * for example, AddObject actuator sometimes releases an object that was cached from previous frame + */ + CListValue* m_delayReleaseObjects; CListValue* m_objectlist; CListValue* m_parentlist; // all 'root' parents @@ -288,6 +293,9 @@ public: CValue* gameobj); void RemoveObject(CValue* gameobj); void DelayedRemoveObject(CValue* gameobj); + + void DelayedReleaseObject(CValue* gameobj); + void NewRemoveObject(CValue* gameobj); void ReplaceMesh(CValue* gameobj, void* meshobj); |