[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13932] trunk/blender/source/gameengine: unknown property fixed in sensor/actuators

Benoit Bolsee benoit.bolsee at online.be
Sat Mar 1 20:05:41 CET 2008


Revision: 13932
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13932
Author:   ben2610
Date:     2008-03-01 20:05:41 +0100 (Sat, 01 Mar 2008)

Log Message:
-----------
unknown property fixed in sensor/actuators

Modified Paths:
--------------
    trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_ISensor.h
    trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.h
    trunk/blender/source/gameengine/GameLogic/SCA_RandomActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_TouchSensor.cpp

Modified: trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp	2008-03-01 18:46:23 UTC (rev 13931)
+++ trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp	2008-03-01 19:05:41 UTC (rev 13932)
@@ -55,7 +55,9 @@
 	SCA_SensorList::iterator its;
 	for (its = m_sensors.begin(); !(its == m_sensors.end()); ++its)
 	{
-		((CValue*)(*its))->Release();
+		//Use Delete for sensor to ensure proper cleaning
+		(*its)->Delete();
+		//((CValue*)(*its))->Release();
 	}
 	SCA_ControllerList::iterator itc; 
 	for (itc = m_controllers.begin(); !(itc == m_controllers.end()); ++itc)

Modified: trunk/blender/source/gameengine/GameLogic/SCA_ISensor.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_ISensor.h	2008-03-01 18:46:23 UTC (rev 13931)
+++ trunk/blender/source/gameengine/GameLogic/SCA_ISensor.h	2008-03-01 19:05:41 UTC (rev 13932)
@@ -97,6 +97,11 @@
 					  bool negmode,
 					  int freq);
 	
+	/** Release sensor
+	 *  For property sensor, it is used to release the pre-calculated expression
+	 *  so that self references are removed before the sensor itself is released
+	 */
+	virtual void Delete() { Release(); }
 	/** Set inversion of pulses on or off. */
 	void SetInvert(bool inv);
 

Modified: trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.cpp	2008-03-01 18:46:23 UTC (rev 13931)
+++ trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.cpp	2008-03-01 19:05:41 UTC (rev 13932)
@@ -66,11 +66,11 @@
 	//CValue* resultval = m_rightexpr->Calculate();
 
 	CValue* orgprop = GetParent()->FindIdentifier(m_checkpropname);
-	if (orgprop)
+	if (!orgprop->IsError())
 	{
 		m_previoustext = orgprop->GetText();
-		orgprop->Release();
 	}
+	orgprop->Release();
 
 	if (m_checktype==KX_PROPSENSOR_INTERVAL)
 	{
@@ -82,17 +82,29 @@
 void SCA_PropertySensor::PrecalculateRangeExpression()
 {
 		CParser pars;
+		//The context is needed to retrieve the property at runtime but it creates
+		//loop of references
 		pars.SetContext(this->AddRef());
 		STR_String checkstr = "(" + m_checkpropval + " <= " 
 							+ m_checkpropname + ") && ( " 
 							+ m_checkpropname + " <= " 
-							+ m_checkpropmaxval;
+							+ m_checkpropmaxval + ")";
 
 		m_range_expr = pars.ProcessText(checkstr);
 }
 
+// Forced deletion of precalculated range expression to break reference loop
+// Use this function when you know that you won't use the sensor anymore
+void SCA_PropertySensor::Delete()
+{
+	if (m_range_expr)
+	{
+		m_range_expr->Release();
+		m_range_expr = NULL;
+	}
+	Release();
+}
 
-
 CValue* SCA_PropertySensor::GetReplica()
 {
 	SCA_PropertySensor* replica = new SCA_PropertySensor(*this);
@@ -164,7 +176,7 @@
 	case KX_PROPSENSOR_EQUAL:
 		{
 			CValue* orgprop = GetParent()->FindIdentifier(m_checkpropname);
-			if (orgprop)
+			if (!orgprop->IsError())
 			{
 				STR_String testprop = orgprop->GetText();
 				// Force strings to upper case, to avoid confusion in
@@ -177,9 +189,8 @@
 				} else {
 					result = (orgprop->GetText() == m_checkpropval);
 				}
-				orgprop->Release();
-
 			}
+			orgprop->Release();
 
 			if (reverse)
 				result = !result;
@@ -244,15 +255,15 @@
 		{
 			CValue* orgprop = GetParent()->FindIdentifier(m_checkpropname);
 				
-			if (orgprop)
+			if (!orgprop->IsError())
 			{
 				if (m_previoustext != orgprop->GetText())
 				{
 					m_previoustext = orgprop->GetText();
 					result = true;
 				}
-				orgprop->Release();
 			}
+			orgprop->Release();
 
 			//cout << " \nSens:Prop:changed!"; /* need implementation here!!! */
 			break;
@@ -388,12 +399,13 @@
 		return NULL;
 	}
 
-	if (FindIdentifier(STR_String(propNameArg))) {
+	CValue *prop = FindIdentifier(STR_String(propNameArg));
+	if (!prop->IsError()) {
 		m_checkpropname = propNameArg;
 	} else {
 		; /* error: bad property name */
 	}
-
+	prop->Release();
 	Py_Return;
 }
 

Modified: trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.h	2008-03-01 18:46:23 UTC (rev 13931)
+++ trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.h	2008-03-01 19:05:41 UTC (rev 13932)
@@ -77,6 +77,7 @@
 					  KX_PROPSENSOR_TYPE checktype,
 					  PyTypeObject* T=&Type );
 	
+	virtual void Delete();
 	virtual ~SCA_PropertySensor();
 	virtual CValue* GetReplica();
 	void	PrecalculateRangeExpression();

Modified: trunk/blender/source/gameengine/GameLogic/SCA_RandomActuator.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_RandomActuator.cpp	2008-03-01 18:46:23 UTC (rev 13931)
+++ trunk/blender/source/gameengine/GameLogic/SCA_RandomActuator.cpp	2008-03-01 19:05:41 UTC (rev 13932)
@@ -61,6 +61,7 @@
 	  m_parameter2(para2),
 	  m_distribution(mode)
 {
+	// m_base is never deleted, probably a memory leak!
 	m_base = new SCA_RandomNumberGenerator(seed);
 	m_counter = 0;
 	enforceConstraints();
@@ -78,6 +79,7 @@
 CValue* SCA_RandomActuator::GetReplica()
 {
 	SCA_RandomActuator* replica = new SCA_RandomActuator(*this);
+	// replication just copy the m_base pointer => common random generator
 	replica->ProcessReplica();
 	CValue::AddDataToReplica(replica);
 
@@ -432,12 +434,12 @@
 
 	CValue* prop = GetParent()->FindIdentifier(nameArg);
 
-	if (prop) {
+	if (!prop->IsError()) {
 		m_propname = nameArg;
-		prop->Release();
 	} else {
 		; /* not found ... */
 	}
+	prop->Release();
 	
 	Py_Return;
 }

Modified: trunk/blender/source/gameengine/Ketsji/KX_TouchSensor.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_TouchSensor.cpp	2008-03-01 18:46:23 UTC (rev 13931)
+++ trunk/blender/source/gameengine/Ketsji/KX_TouchSensor.cpp	2008-03-01 19:05:41 UTC (rev 13932)
@@ -274,10 +274,10 @@
 
 	if (!prop->IsError()) {
 		m_touchedpropname = nameArg;
-		prop->Release();
 	} else {
 		; /* not found ... */
 	}
+	prop->Release();
 	
 	Py_Return;
 }
@@ -351,8 +351,8 @@
 				CValue* val = m_colliders->GetValue(i)->FindIdentifier(m_touchedpropname);
 				if (!val->IsError()) {
 					newList->Add(m_colliders->GetValue(i)->AddRef());
-					val->Release();
 				}
+				val->Release();
 			}
 			
 			i++;





More information about the Bf-blender-cvs mailing list