[Bf-blender-cvs] [2050ecc] master: BGE: Fix T48071: Global logic manager

Porteries Tristan noreply at git.blender.org
Mon Apr 11 00:20:44 CEST 2016


Commit: 2050ecc307de9159b50c7f9798e47a366f505f2e
Author: Porteries Tristan
Date:   Sun Apr 10 17:36:10 2016 +0200
Branches: master
https://developer.blender.org/rB2050ecc307de9159b50c7f9798e47a366f505f2e

BGE: Fix T48071: Global logic manager

Previously the logic manager was used as a global variable for SCA_ILogicBrick::m_sCurrentLogicManager,
this request to always update it before run any python script and allow call function like
ConvertPythonTo[GameObject/Mesh]. The bug showed in T48071 is that as exepted the global
m_sCurrentLogicManager is not updated with the proper scene logic manager.
Instead of trying to fix it by updating the logic manager everywhere and wait next bug report to add
a similar line. The following patch propose a different way:
- Every logic brick now contain its logic manager to SCA_ILogicBrick::m_logicManager, this value is
  set and get by SCA_ILogicBrick::[Set/Get]LogicManager, It's initialized from blender conversion and
  scene merging.
- Function ConvertPythonTo[GameObject/mesh] now take as first argument the logic manager to find name
  coresponding object or mesh. Only ConvertPythonToCamera doesn't do that because it uses the
  KX_Scene::FindCamera function.

Reviewers: moguri

Differential Revision: https://developer.blender.org/D1913

===================================================================

M	source/gameengine/Converter/BL_ActionActuator.cpp
M	source/gameengine/Converter/BL_ArmatureActuator.cpp
M	source/gameengine/Converter/BL_ArmatureConstraint.cpp
M	source/gameengine/Converter/BL_ShapeActionActuator.cpp
M	source/gameengine/Converter/KX_ConvertActuators.cpp
M	source/gameengine/Converter/KX_ConvertControllers.cpp
M	source/gameengine/Converter/KX_ConvertSensors.cpp
M	source/gameengine/GameLogic/SCA_ILogicBrick.cpp
M	source/gameengine/GameLogic/SCA_ILogicBrick.h
M	source/gameengine/GameLogic/SCA_PythonController.cpp
M	source/gameengine/Ketsji/KX_Camera.cpp
M	source/gameengine/Ketsji/KX_CameraActuator.cpp
M	source/gameengine/Ketsji/KX_GameObject.cpp
M	source/gameengine/Ketsji/KX_GameObject.h
M	source/gameengine/Ketsji/KX_MeshProxy.cpp
M	source/gameengine/Ketsji/KX_MeshProxy.h
M	source/gameengine/Ketsji/KX_ObjectActuator.cpp
M	source/gameengine/Ketsji/KX_ParentActuator.cpp
M	source/gameengine/Ketsji/KX_PyConstraintBinding.cpp
M	source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
M	source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp
M	source/gameengine/Ketsji/KX_Scene.cpp
M	source/gameengine/Ketsji/KX_SteeringActuator.cpp
M	source/gameengine/Ketsji/KX_TrackToActuator.cpp
M	source/gameengine/Ketsji/KX_VehicleWrapper.cpp

===================================================================

diff --git a/source/gameengine/Converter/BL_ActionActuator.cpp b/source/gameengine/Converter/BL_ActionActuator.cpp
index d9865c1..d28cdb8 100644
--- a/source/gameengine/Converter/BL_ActionActuator.cpp
+++ b/source/gameengine/Converter/BL_ActionActuator.cpp
@@ -584,7 +584,7 @@ int BL_ActionActuator::pyattr_set_action(void *self_v, const KX_PYATTRIBUTE_DEF
 	
 	if (val != "")
 	{
-		action= (bAction*)SCA_ILogicBrick::m_sCurrentLogicManager->GetActionByName(val);
+		action= (bAction*)self->GetLogicManager()->GetActionByName(val);
 		if (!action)
 		{
 			PyErr_SetString(PyExc_ValueError, "actuator.action = val: Action Actuator, action not found!");
diff --git a/source/gameengine/Converter/BL_ArmatureActuator.cpp b/source/gameengine/Converter/BL_ArmatureActuator.cpp
index e38cb6e..67cc7d2 100644
--- a/source/gameengine/Converter/BL_ArmatureActuator.cpp
+++ b/source/gameengine/Converter/BL_ArmatureActuator.cpp
@@ -243,7 +243,7 @@ int BL_ArmatureActuator::pyattr_set_object(void *self, const struct KX_PYATTRIBU
 	KX_GameObject* &target = (!strcmp(attrdef->m_name, "target")) ? actuator->m_gametarget : actuator->m_gamesubtarget;
 	KX_GameObject *gameobj;
 		
-	if (!ConvertPythonToGameObject(value, &gameobj, true, "actuator.object = value: BL_ArmatureActuator"))
+	if (!ConvertPythonToGameObject(actuator->GetLogicManager(), value, &gameobj, true, "actuator.object = value: BL_ArmatureActuator"))
 		return PY_SET_ATTR_FAIL; // ConvertPythonToGameObject sets the error
 		
 	if (target != NULL)
diff --git a/source/gameengine/Converter/BL_ArmatureConstraint.cpp b/source/gameengine/Converter/BL_ArmatureConstraint.cpp
index 88d82e2..d0c7e06 100644
--- a/source/gameengine/Converter/BL_ArmatureConstraint.cpp
+++ b/source/gameengine/Converter/BL_ArmatureConstraint.cpp
@@ -36,6 +36,7 @@
 #include "BL_ArmatureObject.h"
 #include "BLI_math.h"
 #include "BLI_string.h"
+#include "KX_PythonInit.h"
 
 #ifdef WITH_PYTHON
 
@@ -360,6 +361,7 @@ int BL_ArmatureConstraint::py_attr_setattr(void *self_v, const struct KX_PYATTRI
 	int ival;
 	double dval;
 //	char* sval;
+	SCA_LogicManager *logicmgr = KX_GetActiveScene()->GetLogicManager();
 	KX_GameObject *oval;
 
 	if (!constraint) {
@@ -387,13 +389,13 @@ int BL_ArmatureConstraint::py_attr_setattr(void *self_v, const struct KX_PYATTRI
 		return PY_SET_ATTR_SUCCESS;
 
 	case BCA_TARGET:
-		if (!ConvertPythonToGameObject(value, &oval, true, "constraint.target = value: BL_ArmatureConstraint"))
+		if (!ConvertPythonToGameObject(logicmgr, value, &oval, true, "constraint.target = value: BL_ArmatureConstraint"))
 			return PY_SET_ATTR_FAIL; // ConvertPythonToGameObject sets the error
 		self->SetTarget(oval);
 		return PY_SET_ATTR_SUCCESS;
 
 	case BCA_SUBTARGET:
-		if (!ConvertPythonToGameObject(value, &oval, true, "constraint.subtarget = value: BL_ArmatureConstraint"))
+		if (!ConvertPythonToGameObject(logicmgr, value, &oval, true, "constraint.subtarget = value: BL_ArmatureConstraint"))
 			return PY_SET_ATTR_FAIL; // ConvertPythonToGameObject sets the error
 		self->SetSubtarget(oval);
 		return PY_SET_ATTR_SUCCESS;
diff --git a/source/gameengine/Converter/BL_ShapeActionActuator.cpp b/source/gameengine/Converter/BL_ShapeActionActuator.cpp
index e8f4512..f21db41 100644
--- a/source/gameengine/Converter/BL_ShapeActionActuator.cpp
+++ b/source/gameengine/Converter/BL_ShapeActionActuator.cpp
@@ -547,7 +547,7 @@ int BL_ShapeActionActuator::pyattr_set_action(void *self_v, const KX_PYATTRIBUTE
 	
 	if (val != "")
 	{
-		action= (bAction*)SCA_ILogicBrick::m_sCurrentLogicManager->GetActionByName(val);
+		action= (bAction*)self->GetLogicManager()->GetActionByName(val);
 		if (action==NULL)
 		{
 			PyErr_SetString(PyExc_ValueError, "actuator.action = val: Shape Action Actuator, action not found!");
diff --git a/source/gameengine/Converter/KX_ConvertActuators.cpp b/source/gameengine/Converter/KX_ConvertActuators.cpp
index 021111b..455fef0 100644
--- a/source/gameengine/Converter/KX_ConvertActuators.cpp
+++ b/source/gameengine/Converter/KX_ConvertActuators.cpp
@@ -1127,6 +1127,7 @@ void BL_ConvertActuators(const char* maggiename,
 			uniquename += uniqueval->GetText();
 			uniqueval->Release();
 			baseact->SetName(bact->name);
+			baseact->SetLogicManager(logicmgr);
 			//gameobj->SetProperty(uniquename,baseact);
 			gameobj->AddActuator(baseact);
 			
diff --git a/source/gameengine/Converter/KX_ConvertControllers.cpp b/source/gameengine/Converter/KX_ConvertControllers.cpp
index e369708..f55d81a 100644
--- a/source/gameengine/Converter/KX_ConvertControllers.cpp
+++ b/source/gameengine/Converter/KX_ConvertControllers.cpp
@@ -214,6 +214,7 @@ void BL_ConvertControllers(
 			//at some point it should either be implemented globally (and saved as a separate var) or removed.
 			//gamecontroller->SetName(uniquename);
 			gamecontroller->SetName(bcontr->name);
+			gamecontroller->SetLogicManager(logicmgr);
 			gameobj->AddController(gamecontroller);
 			
 			converter->RegisterGameController(gamecontroller, bcontr);
diff --git a/source/gameengine/Converter/KX_ConvertSensors.cpp b/source/gameengine/Converter/KX_ConvertSensors.cpp
index 79fd9cb..5e897bb 100644
--- a/source/gameengine/Converter/KX_ConvertSensors.cpp
+++ b/source/gameengine/Converter/KX_ConvertSensors.cpp
@@ -608,6 +608,7 @@ void BL_ConvertSensors(struct Object* blenderobject,
 				gamesensor->SetLevel(level);
 				gamesensor->SetTap(tap);
 				gamesensor->SetName(sens->name);
+				gamesensor->SetLogicManager(logicmgr);
 
 				gameobj->AddSensor(gamesensor);
 
diff --git a/source/gameengine/GameLogic/SCA_ILogicBrick.cpp b/source/gameengine/GameLogic/SCA_ILogicBrick.cpp
index 72a0b39..d0a6e45 100644
--- a/source/gameengine/GameLogic/SCA_ILogicBrick.cpp
+++ b/source/gameengine/GameLogic/SCA_ILogicBrick.cpp
@@ -35,12 +35,11 @@
 #include "SCA_ILogicBrick.h"
 #include "EXP_PyObjectPlus.h"
 
-SCA_LogicManager* SCA_ILogicBrick::m_sCurrentLogicManager = NULL;
-
 SCA_ILogicBrick::SCA_ILogicBrick(SCA_IObject* gameobj)
 	:
 	CValue(),
 	m_gameobj(gameobj),
+	m_logicManager(NULL),
 	m_Execute_Priority(0),
 	m_Execute_Ueber_Priority(0),
 	m_bActive(false),
@@ -143,6 +142,16 @@ bool SCA_ILogicBrick::LessComparedTo(SCA_ILogicBrick* other)
 		(this->m_Execute_Priority < other->m_Execute_Priority));
 }
 
+void SCA_ILogicBrick::SetLogicManager(SCA_LogicManager *logicmgr)
+{
+	m_logicManager = logicmgr;
+}
+
+SCA_LogicManager *SCA_ILogicBrick::GetLogicManager()
+{
+	return m_logicManager;
+}
+
 void SCA_ILogicBrick::RegisterEvent(CValue* eventval)
 {
 	if (m_eventval)
diff --git a/source/gameengine/GameLogic/SCA_ILogicBrick.h b/source/gameengine/GameLogic/SCA_ILogicBrick.h
index a372578..f9ef18c 100644
--- a/source/gameengine/GameLogic/SCA_ILogicBrick.h
+++ b/source/gameengine/GameLogic/SCA_ILogicBrick.h
@@ -40,12 +40,14 @@
 
 class NG_NetworkScene;
 class SCA_IScene;
+class SCA_LogicManager;
 
 class SCA_ILogicBrick : public CValue
 {
 	Py_Header
 protected:
 	SCA_IObject*		m_gameobj;
+	SCA_LogicManager *m_logicManager;
 	int					m_Execute_Priority;
 	int					m_Execute_Ueber_Priority;
 
@@ -127,9 +129,8 @@ public:
 
 	virtual	bool		LessComparedTo(SCA_ILogicBrick* other);
 
-	/* runtime variable, set when Triggering the python controller */
-	static class SCA_LogicManager*	m_sCurrentLogicManager;
-
+	virtual void SetLogicManager(SCA_LogicManager *logicmgr);
+	SCA_LogicManager *GetLogicManager();
 
 	/* for moving logic bricks between scenes */
 	virtual void		Replace_IScene(SCA_IScene *val) {}
diff --git a/source/gameengine/GameLogic/SCA_PythonController.cpp b/source/gameengine/GameLogic/SCA_PythonController.cpp
index fa30e3a..25936b3 100644
--- a/source/gameengine/GameLogic/SCA_PythonController.cpp
+++ b/source/gameengine/GameLogic/SCA_PythonController.cpp
@@ -386,8 +386,7 @@ bool SCA_PythonController::Import()
 void SCA_PythonController::Trigger(SCA_LogicManager* logicmgr)
 {
 	m_sCurrentController = this;
-	m_sCurrentLogicManager = logicmgr;
-	
+
 	PyObject *excdict=		NULL;
 	PyObject *resultobj=	NULL;
 	
@@ -478,7 +477,7 @@ PyObject *SCA_PythonController::PyActivate(PyObject *value)
 	if (actu==NULL)
 		return NULL;
 	
-	m_sCurrentLogicManager->AddActiveActuator((SCA_IActuator*)actu, true);
+	m_logicManager->AddActiveActuator((SCA_IActuator*)actu, true);
 	Py_RETURN_NONE;
 }
 
@@ -493,7 +492,7 @@ PyObject *SCA_PythonController::PyDeActivate(PyObject *value)
 	if (actu==NULL)
 		return NULL;
 	
-	m_sCurrentLogicManager->AddActiveActuator((SCA_IActuator*)actu, false);
+	m_logicManager->AddActiveActuator((SCA_IActuator*)actu, false);
 	Py_RETURN_NONE;
 }
 
diff --git a/source/gameengine/Ketsji/KX_Camera.cpp b/source/gameengine/Ketsji/KX_Camera.cpp
index 361cd65..89aea80 100644
--- a/source/gameengine/Ketsji/KX_Camera.cpp
+++ b/source/gameengine/Ketsji/KX_Camera.cpp
@@ -1035,7 +1035,7 @@ KX_PYMETHODDEF_DOC_O(KX_Camera, getScreenPosition,
 	{
 		PyErr_Clear();
 
-		if (ConvertPythonToGameObject(value, &obj, true, ""))
+		if (ConvertPythonToGameObject(GetScene()->GetLogicManager(), value, &obj, true, ""))
 		{
 			PyErr_Clear();
 			vect = MT_Vector3(obj->NodeGetWorldPosition());
diff --git a/source/gameengine/Ketsji/KX_CameraActuator.cpp b/source/gameengine/Ketsji/KX_CameraActuator.cpp
index f065e3f..e488bf3 100644
--- a/source/gameengine/Ketsji/KX_CameraActuator.cpp
+++ b/source/gameengine/Ketsji/KX_CameraActuator.cpp
@@ -411,7 +411,7 @@ int KX_CameraActuator::pyattr_set_object(void *self_v, const KX_PYATTRIBUTE_DEF
 	KX_CameraActuator* self = static_cast<KX_CameraActuator*>(self_v);
 	KX_GameObject *gameobj;
 	
-	if (!ConvertPythonToGameObject(value, &gameobj, true, "actuator.object = value: KX_CameraActuator"))
+	if (!ConvertPythonToGameObject(self->GetLogicManager(), value, &gameobj, true, "actuator.object = value: KX_CameraActuator"))
 		return PY_SET_ATTR_FAIL; // ConvertPythonToGameObject sets the error
 	
 	if (self->m_ob)
diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp
index 877e958..69c1af3 100644
--- a/source/gameengine/Ketsji/KX_GameObject.cpp
+++ b/source/gameengine/Ketsji/KX_GameObject.cpp
@@ -1597,14 +1597,6 @@ void KX_GameObject::RunCollisionCallbacks(KX_GameObject *collider, const MT_Vect
 	if (!m_collisionCallbacks || PyList_GET_SIZE(m_c

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list