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>2006-05-23 01:03:43 +0400
committerErwin Coumans <blender@erwincoumans.com>2006-05-23 01:03:43 +0400
commitab71e2a9b55e0982d1134792d10af55464c7ac9e (patch)
tree4a53791a67d3234360107a33c5365d4de4844bb7 /source/gameengine/Ketsji
parent677cf7f1333c634a52227a15d6dcb3351b39febc (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.cpp31
-rw-r--r--source/gameengine/Ketsji/KX_PyConstraintBinding.cpp24
-rw-r--r--source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_Scene.cpp22
-rw-r--r--source/gameengine/Ketsji/KX_Scene.h8
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);