doxygen: prevent GPL license block from being parsed as doxygen comment.
[blender.git] / source / gameengine / GameLogic / SCA_PropertySensor.cpp
index 9c09c84..0a0362e 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*
  * Property sensor
  *
  * $Id$
@@ -17,7 +17,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  *
  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
  * All rights reserved.
@@ -29,6 +29,8 @@
  * ***** END GPL LICENSE BLOCK *****
  */
 
+#include <stddef.h>
+
 #include <iostream>
 #include "SCA_PropertySensor.h"
 #include "Operator2Expr.h"
 #include "SCA_EventManager.h"
 #include "SCA_LogicManager.h"
 #include "BoolValue.h"
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
+#include "FloatValue.h"
+#include <stdio.h>
 
 SCA_PropertySensor::SCA_PropertySensor(SCA_EventManager* eventmgr,
                                                                         SCA_IObject* gameobj,
@@ -190,6 +190,22 @@ bool       SCA_PropertySensor::CheckPropertyCondition()
                                        m_checkpropval.Upper();
                                }
                                result = (testprop == m_checkpropval);
+                               
+                               /* Patch: floating point values cant use strings usefully since you can have "0.0" == "0.0000"
+                                * this could be made into a generic Value class function for comparing values with a string.
+                                */
+                               if(result==false && dynamic_cast<CFloatValue *>(orgprop) != NULL) {
+                                       float f;
+                                       
+                                       if(EOF == sscanf(m_checkpropval.ReadPtr(), "%f", &f))
+                                       {
+                                               //error
+                                       } 
+                                       else {
+                                               result = (f == ((CFloatValue *)orgprop)->GetFloat());
+                                       }
+                               }
+                               /* end patch */
                        }
                        orgprop->Release();
 
@@ -290,15 +306,43 @@ CValue* SCA_PropertySensor::FindIdentifier(const STR_String& identifiername)
        return  GetParent()->FindIdentifier(identifiername);
 }
 
+#ifdef WITH_PYTHON
+
+/* ------------------------------------------------------------------------- */
+/* Python functions                                                          */
+/* ------------------------------------------------------------------------- */
+
 int SCA_PropertySensor::validValueForProperty(void *self, const PyAttributeDef*)
 {
+       /*  If someone actually do type checking please make sure the 'max' and 'min'
+               are checked as well (currently they are calling the PrecalculateRangeExpression
+               function directly       */
+
        /*  There is no type checking at this moment, unfortunately...           */
        return 0;
 }
 
-/* ------------------------------------------------------------------------- */
-/* Python functions                                                          */
-/* ------------------------------------------------------------------------- */
+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 = {
@@ -328,10 +372,14 @@ PyMethodDef SCA_PropertySensor::Methods[] = {
 };
 
 PyAttributeDef SCA_PropertySensor::Attributes[] = {
-       KX_PYATTRIBUTE_INT_RW("mode",KX_PROPSENSOR_NODEF,KX_PROPSENSOR_MAX-1,false,SCA_PropertySensor,m_checktype),
+       KX_PYATTRIBUTE_INT_RW_CHECK("mode",KX_PROPSENSOR_NODEF,KX_PROPSENSOR_MAX-1,false,SCA_PropertySensor,m_checktype,modeChange),
        KX_PYATTRIBUTE_STRING_RW_CHECK("propName",0,100,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),
        { NULL }        //Sentinel
 };
 
+#endif // WITH_PYTHON
+
 /* eof */