[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19262] trunk/blender/source/gameengine: BGE patch 18368: Modulus (ie %) expression controller in BGE.

Benoit Bolsee benoit.bolsee at online.be
Wed Mar 11 23:11:53 CET 2009


Revision: 19262
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19262
Author:   ben2610
Date:     2009-03-11 23:11:52 +0100 (Wed, 11 Mar 2009)

Log Message:
-----------
BGE patch 18368: Modulus (ie %) expression controller in BGE. Implement a cache for the expression for better performance.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Expressions/FloatValue.cpp
    trunk/blender/source/gameengine/Expressions/InputParser.cpp
    trunk/blender/source/gameengine/Expressions/InputParser.h
    trunk/blender/source/gameengine/Expressions/IntValue.cpp
    trunk/blender/source/gameengine/Expressions/Value.cpp
    trunk/blender/source/gameengine/Expressions/Value.h
    trunk/blender/source/gameengine/GameLogic/SCA_ExpressionController.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_ExpressionController.h
    trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.h
    trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_ISensor.h
    trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.h

Modified: trunk/blender/source/gameengine/Expressions/FloatValue.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/FloatValue.cpp	2009-03-11 20:25:31 UTC (rev 19261)
+++ trunk/blender/source/gameengine/Expressions/FloatValue.cpp	2009-03-11 22:11:52 UTC (rev 19262)
@@ -127,6 +127,9 @@
 		{
 			switch (op)
 			{
+			case VALUE_MOD_OPERATOR:
+				ret = new CFloatValue(fmod(((CIntValue *) val)->GetInt(), m_float));
+				break;
 			case VALUE_ADD_OPERATOR:
 				ret = new CFloatValue(((CIntValue *) val)->GetInt() + m_float);
 				break;
@@ -171,6 +174,9 @@
 		{
 			switch (op)
 			{
+			case VALUE_MOD_OPERATOR:
+				ret = new CFloatValue(fmod(((CFloatValue *) val)->GetFloat(), m_float));
+				break;
 			case VALUE_ADD_OPERATOR:
 				ret = new CFloatValue(((CFloatValue *) val)->GetFloat() + m_float);
 				break;

Modified: trunk/blender/source/gameengine/Expressions/InputParser.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/InputParser.cpp	2009-03-11 20:25:31 UTC (rev 19261)
+++ trunk/blender/source/gameengine/Expressions/InputParser.cpp	2009-03-11 22:11:52 UTC (rev 19262)
@@ -175,6 +175,9 @@
     case ',':
 		sym = commasym; NextCh();
 		break;
+	case '%' :
+		sym = opsym; opkind = OPmodulus; NextCh();
+		break;
     case '+' :
 		sym = opsym; opkind = OPplus; NextCh();
 		break;
@@ -370,6 +373,7 @@
 	case OPunequal: return 3;
     case OPplus:
     case OPminus: return 4;
+	case OPmodulus:
     case OPtimes:
     case OPdivide: return 5;
 	}
@@ -390,6 +394,7 @@
 			NextSym();
 			e2 = Ex(i + 1);
 			switch(opkind2) {
+			case OPmodulus: e1 = new COperator2Expr(VALUE_MOD_OPERATOR,e1, e2); break;
 			case OPplus: e1 = new COperator2Expr(VALUE_ADD_OPERATOR,e1, e2); break;
 			case OPminus: e1 = new COperator2Expr(VALUE_SUB_OPERATOR,e1, e2); break;
 			case OPtimes:	e1 = new COperator2Expr(VALUE_MUL_OPERATOR,e1, e2); break;

Modified: trunk/blender/source/gameengine/Expressions/InputParser.h
===================================================================
--- trunk/blender/source/gameengine/Expressions/InputParser.h	2009-03-11 20:25:31 UTC (rev 19261)
+++ trunk/blender/source/gameengine/Expressions/InputParser.h	2009-03-11 22:11:52 UTC (rev 19262)
@@ -49,6 +49,7 @@
 	};			// all kinds of symbols
 
 	enum optype {
+		OPmodulus,
 		OPplus,
 		OPminus,
 		OPtimes,

Modified: trunk/blender/source/gameengine/Expressions/IntValue.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/IntValue.cpp	2009-03-11 20:25:31 UTC (rev 19261)
+++ trunk/blender/source/gameengine/Expressions/IntValue.cpp	2009-03-11 22:11:52 UTC (rev 19262)
@@ -125,6 +125,9 @@
 	case VALUE_INT_TYPE:
 		{
 			switch (op) {
+			case VALUE_MOD_OPERATOR:
+				ret = new CIntValue (((CIntValue *) val)->GetInt() % m_int);
+				break;
 			case VALUE_ADD_OPERATOR:
 				ret = new CIntValue (((CIntValue *) val)->GetInt() + m_int);
 				break;
@@ -181,6 +184,9 @@
 	case VALUE_FLOAT_TYPE:
 		{
 			switch (op) {
+			case VALUE_MOD_OPERATOR:
+				ret = new CFloatValue(fmod(((CFloatValue *) val)->GetFloat(), m_int));
+				break;
 			case VALUE_ADD_OPERATOR:
 				ret = new CFloatValue (((CFloatValue *) val)->GetFloat() + m_int);
 				break;

Modified: trunk/blender/source/gameengine/Expressions/Value.cpp
===================================================================
--- trunk/blender/source/gameengine/Expressions/Value.cpp	2009-03-11 20:25:31 UTC (rev 19261)
+++ trunk/blender/source/gameengine/Expressions/Value.cpp	2009-03-11 22:11:52 UTC (rev 19262)
@@ -52,6 +52,10 @@
 {
 	return  ((CValue*)v)->Calc(VALUE_DIV_OPERATOR,(CValue*)w);
 }
+PyObject* cvalue_mod(PyObject*v, PyObject*w)
+{
+	return  ((CValue*)v)->Calc(VALUE_MOD_OPERATOR,(CValue*)w);
+}
 PyObject* cvalue_neg(PyObject*v)
 {
 	return  ((CValue*)v)->Calc(VALUE_NEG_OPERATOR,(CValue*)v);
@@ -112,7 +116,7 @@
 	(binaryfunc)cvalue_sub, /*nb_subtract*/
 	(binaryfunc)cvalue_mul, /*nb_multiply*/
 	(binaryfunc)cvalue_div, /*nb_divide*/
-	0,//(binaryfunc)cvalue_remainder,	/*nb_remainder*/
+	(binaryfunc)cvalue_mod, /*nb_remainder*/
 	0,//(binaryfunc)cvalue_divmod,	/*nb_divmod*/
 	0,//0,//0,//0,//(ternaryfunc)cvalue_pow, /*nb_power*/
 	(unaryfunc)cvalue_neg, /*nb_negative*/
@@ -257,6 +261,9 @@
 	
 	STR_String opmsg;
 	switch (op) {
+	case VALUE_MOD_OPERATOR:
+		opmsg = " % ";
+		break;
 	case VALUE_ADD_OPERATOR:
 		opmsg = " + ";
 		break;

Modified: trunk/blender/source/gameengine/Expressions/Value.h
===================================================================
--- trunk/blender/source/gameengine/Expressions/Value.h	2009-03-11 20:25:31 UTC (rev 19261)
+++ trunk/blender/source/gameengine/Expressions/Value.h	2009-03-11 22:11:52 UTC (rev 19262)
@@ -75,6 +75,7 @@
 
 enum VALUE_OPERATOR {
 	
+	VALUE_MOD_OPERATOR,			// %
 	VALUE_ADD_OPERATOR,			// +
 	VALUE_SUB_OPERATOR,			// -
 	VALUE_MUL_OPERATOR,			// *

Modified: trunk/blender/source/gameengine/GameLogic/SCA_ExpressionController.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_ExpressionController.cpp	2009-03-11 20:25:31 UTC (rev 19261)
+++ trunk/blender/source/gameengine/GameLogic/SCA_ExpressionController.cpp	2009-03-11 22:11:52 UTC (rev 19262)
@@ -49,7 +49,8 @@
 												   const STR_String& exprtext,
 												   PyTypeObject* T)
 	:SCA_IController(gameobj,T),
-	m_exprText(exprtext)
+	m_exprText(exprtext),
+	m_exprCache(NULL)
 {
 }
 
@@ -57,6 +58,8 @@
 
 SCA_ExpressionController::~SCA_ExpressionController()
 {
+	if (m_exprCache)
+		m_exprCache->Release();
 }
 
 
@@ -65,6 +68,7 @@
 {
 	SCA_ExpressionController* replica = new SCA_ExpressionController(*this);
 	replica->m_exprText = m_exprText;
+	replica->m_exprCache = NULL;
 	// this will copy properties and so on...
 	CValue::AddDataToReplica(replica);
 
@@ -72,18 +76,32 @@
 }
 
 
+// Forced deletion of precalculated expression to break reference loop
+// Use this function when you know that you won't use the sensor anymore
+void SCA_ExpressionController::Delete()
+{
+	if (m_exprCache)
+	{
+		m_exprCache->Release();
+		m_exprCache = NULL;
+	}
+	Release();
+}
 
+
 void SCA_ExpressionController::Trigger(SCA_LogicManager* logicmgr)
 {
 
 	bool expressionresult = false;
-
-	CParser parser;
-	parser.SetContext(this->AddRef());
-	CExpression* expr = parser.ProcessText(m_exprText);
-	if (expr)
+	if (!m_exprCache)
 	{
-		CValue* value = expr->Calculate();
+		CParser parser;
+		parser.SetContext(this->AddRef());
+		m_exprCache = parser.ProcessText(m_exprText);
+	}
+	if (m_exprCache)
+	{
+		CValue* value = m_exprCache->Calculate();
 		if (value)
 		{
 			if (value->IsError())
@@ -97,7 +115,8 @@
 			value->Release();
 
 		}
-		expr->Release();
+		//m_exprCache->Release();
+		//m_exprCache = NULL;
 	}
 
 	/*

Modified: trunk/blender/source/gameengine/GameLogic/SCA_ExpressionController.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_ExpressionController.h	2009-03-11 20:25:31 UTC (rev 19261)
+++ trunk/blender/source/gameengine/GameLogic/SCA_ExpressionController.h	2009-03-11 22:11:52 UTC (rev 19262)
@@ -38,6 +38,7 @@
 {
 //	Py_Header;
 	STR_String			m_exprText;
+	CExpression*		m_exprCache;
 
 public:
 	SCA_ExpressionController(SCA_IObject* gameobj,
@@ -48,6 +49,11 @@
 	virtual CValue* GetReplica();
 	virtual void Trigger(SCA_LogicManager* logicmgr);
 	virtual CValue*		FindIdentifier(const STR_String& identifiername);
+	/** 
+	 *  used to release the expression cache
+	 *  so that self references are removed before the controller itself is released
+	 */
+	virtual void Delete();
 
 	/* --------------------------------------------------------------------- */
 	/* Python interface ---------------------------------------------------- */

Modified: trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.h	2009-03-11 20:25:31 UTC (rev 19261)
+++ trunk/blender/source/gameengine/GameLogic/SCA_ILogicBrick.h	2009-03-11 22:11:52 UTC (rev 19262)
@@ -62,6 +62,7 @@
 	SCA_IObject*	GetParent();
 	virtual void	ReParent(SCA_IObject* parent);
 	virtual void	Relink(GEN_Map<GEN_HashedPtr, void*> *obj_map);
+	virtual void Delete() { Release(); }
 
 	// act as a BoolValue (with value IsPositiveTrigger)
 	virtual CValue*	Calc(VALUE_OPERATOR op, CValue *val);

Modified: trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp	2009-03-11 20:25:31 UTC (rev 19261)
+++ trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp	2009-03-11 22:11:52 UTC (rev 19262)
@@ -59,7 +59,9 @@
 	SCA_ControllerList::iterator itc; 
 	for (itc = m_controllers.begin(); !(itc == m_controllers.end()); ++itc)
 	{
-		((CValue*)(*itc))->Release();
+		//Use Delete for controller to ensure proper cleaning (expression controller)
+		(*itc)->Delete();
+		//((CValue*)(*itc))->Release();
 	}
 	SCA_ActuatorList::iterator ita;
 	for (ita = m_registeredActuators.begin(); !(ita==m_registeredActuators.end()); ++ita)

Modified: trunk/blender/source/gameengine/GameLogic/SCA_ISensor.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_ISensor.h	2009-03-11 20:25:31 UTC (rev 19261)
+++ trunk/blender/source/gameengine/GameLogic/SCA_ISensor.h	2009-03-11 22:11:52 UTC (rev 19262)
@@ -105,11 +105,6 @@
 					  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);
 	/** set the level detection on or off */

Modified: trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.h	2009-03-11 20:25:31 UTC (rev 19261)
+++ trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.h	2009-03-11 22:11:52 UTC (rev 19262)
@@ -70,6 +70,10 @@
 					  KX_PROPSENSOR_TYPE checktype,
 					  PyTypeObject* T=&Type );
 	
+	/** 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list