[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48662] trunk/blender/source/gameengine/ GameLogic: Fix for [#31122] " Properties cant have Spaces in names when using interval as a evaluation.

Mitchell Stokes mogurijin at gmail.com
Thu Jul 5 22:34:42 CEST 2012


Revision: 48662
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48662
Author:   moguri
Date:     2012-07-05 20:34:42 +0000 (Thu, 05 Jul 2012)
Log Message:
-----------
Fix for [#31122] "Properties cant have Spaces in names when using interval as a evaluation. Or else it'll fail to activate actuator." reported by Auuman Anubis.

I cleaned up the INTERVAL check to do a much cleaner (and saner) range check that doesn't get messed up by spaces.

Modified Paths:
--------------
    trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.h

Modified: trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.cpp	2012-07-05 19:19:50 UTC (rev 48661)
+++ trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.cpp	2012-07-05 20:34:42 UTC (rev 48662)
@@ -57,8 +57,7 @@
 	  m_checktype(checktype),
 	  m_checkpropval(propval),
 	  m_checkpropmaxval(propmaxval),
-	  m_checkpropname(propname),
-	  m_range_expr(NULL)
+	  m_checkpropname(propname)
 {
 	//CParser pars;
 	//pars.SetContext(this->AddRef());
@@ -71,10 +70,6 @@
 	}
 	orgprop->Release();
 
-	if (m_checktype==KX_PROPSENSOR_INTERVAL)
-	{
-		PrecalculateRangeExpression();
-	}
 	Init();
 }
 
@@ -85,46 +80,13 @@
 	m_reset = true;
 }
 
-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_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);
 	// m_range_expr must be recalculated on replica!
 	replica->ProcessReplica();
 	replica->Init();
-
-	replica->m_range_expr = NULL;
-	if (replica->m_checktype==KX_PROPSENSOR_INTERVAL)
-	{
-		replica->PrecalculateRangeExpression();
-	}
 	
-	
 	return replica;
 }
 
@@ -143,15 +105,6 @@
 
 SCA_PropertySensor::~SCA_PropertySensor()
 {
-	//if (m_rightexpr)
-	//	m_rightexpr->Release();
-
-	if (m_range_expr)
-	{
-		m_range_expr->Release();
-		m_range_expr=NULL;
-	}
-
 }
 
 
@@ -241,34 +194,13 @@
 		}
 	case KX_PROPSENSOR_INTERVAL:
 		{
-			//CValue* orgprop = GetParent()->FindIdentifier(m_checkpropname);
-			//if (orgprop)
-			//{
-				if (m_range_expr)
-				{
-					CValue* vallie = m_range_expr->Calculate();
-					if (vallie)
-					{
-						const STR_String& errtext = vallie->GetText();
-						if (&errtext == &CBoolValue::sTrueString)
-						{
-							result = true;
-						} else
-						{
-							if (vallie->IsError())
-							{
-								//printf (errtext.ReadPtr());
-							} 
-						}
-						
-						vallie->Release();
-					}
-				}
+			CValue* orgprop = GetParent()->FindIdentifier(m_checkpropname);
+			if (!orgprop->IsError())
+			{
+				float val = orgprop->GetText().ToFloat(), min = m_checkpropval.ToFloat(), max = m_checkpropmaxval.ToFloat();
 
-				
-			//}
-			
-		//cout << " \nSens:Prop:interval!"; /* need implementation here!!! */
+				result = (min <= val) && (val <= max);
+			}
 
 		break;
 		}
@@ -326,28 +258,6 @@
 	return 0;
 }
 
-int SCA_PropertySensor::validValueForIntervalProperty(void *self, const PyAttributeDef*)
-{
-	SCA_PropertySensor*	sensor = reinterpret_cast<SCA_PropertySensor*>(self);
-
-	if (sensor->m_checktype==KX_PROPSENSOR_INTERVAL)
-	{
-		sensor->PrecalculateRangeExpression();
-	}
-	return 0;
-}
-
-int SCA_PropertySensor::modeChange(void *self, const PyAttributeDef* attrdef)
-{
-	SCA_PropertySensor*	sensor = reinterpret_cast<SCA_PropertySensor*>(self);
-
-	if (sensor->m_checktype==KX_PROPSENSOR_INTERVAL)
-	{
-		sensor->PrecalculateRangeExpression();
-	}
-	return 0;
-}
-
 /* Integration hooks ------------------------------------------------------- */
 PyTypeObject SCA_PropertySensor::Type = {
 	PyVarObject_HEAD_INIT(NULL, 0)
@@ -376,11 +286,11 @@
 };
 
 PyAttributeDef SCA_PropertySensor::Attributes[] = {
-	KX_PYATTRIBUTE_INT_RW_CHECK("mode",KX_PROPSENSOR_NODEF,KX_PROPSENSOR_MAX-1,false,SCA_PropertySensor,m_checktype,modeChange),
+	KX_PYATTRIBUTE_INT_RW("mode",KX_PROPSENSOR_NODEF,KX_PROPSENSOR_MAX-1,false,SCA_PropertySensor,m_checktype),
 	KX_PYATTRIBUTE_STRING_RW_CHECK("propName",0,MAX_PROP_NAME,false,SCA_PropertySensor,m_checkpropname,CheckProperty),
 	KX_PYATTRIBUTE_STRING_RW_CHECK("value",0,100,false,SCA_PropertySensor,m_checkpropval,validValueForProperty),
-	KX_PYATTRIBUTE_STRING_RW_CHECK("min",0,100,false,SCA_PropertySensor,m_checkpropval,validValueForIntervalProperty),
-	KX_PYATTRIBUTE_STRING_RW_CHECK("max",0,100,false,SCA_PropertySensor,m_checkpropmaxval,validValueForIntervalProperty),
+	KX_PYATTRIBUTE_STRING_RW_CHECK("min",0,100,false,SCA_PropertySensor,m_checkpropval,validValueForProperty),
+	KX_PYATTRIBUTE_STRING_RW_CHECK("max",0,100,false,SCA_PropertySensor,m_checkpropmaxval,validValueForProperty),
 	{ NULL }	//Sentinel
 };
 

Modified: trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.h	2012-07-05 19:19:50 UTC (rev 48661)
+++ trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.h	2012-07-05 20:34:42 UTC (rev 48662)
@@ -46,7 +46,6 @@
 	STR_String		m_previoustext;
 	bool			m_lastresult;
 	bool			m_recentresult;
-	CExpression*	m_range_expr;
 
  protected:
 
@@ -69,16 +68,10 @@
 					  const STR_String& propval,
 					  const STR_String& propmaxval,
 					  KX_PROPSENSOR_TYPE checktype);
-	
-	/** 
-	 *  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();
+
 	virtual ~SCA_PropertySensor();
 	virtual CValue* GetReplica();
 	virtual void Init();
-	void	PrecalculateRangeExpression();
 	bool	CheckPropertyCondition();
 
 	virtual bool Evaluate();
@@ -96,16 +89,6 @@
 	 */
 	static int validValueForProperty(void* self, const PyAttributeDef*);
 
-	/**
-	 * Test whether this is a sensible value for interval (type check) and updates Range Expression
-	 */
-	static int validValueForIntervalProperty(void* self, const PyAttributeDef*);
-
-	/**
-	 * Test if the new mode is interval. If positive updates Range Expression
-	 */
-	static int modeChange(void* self, const PyAttributeDef* attrdef);
-
 #endif
 };
 




More information about the Bf-blender-cvs mailing list