Index: source/gameengine/GameLogic/SCA_PropertySensor.cpp =================================================================== --- source/gameengine/GameLogic/SCA_PropertySensor.cpp (revision 47110) +++ source/gameengine/GameLogic/SCA_PropertySensor.cpp (working copy) @@ -58,7 +58,8 @@ m_checkpropval(propval), m_checkpropmaxval(propmaxval), m_checkpropname(propname), - m_range_expr(NULL) + m_range_expr_low(NULL), + m_range_expr_high(NULL) { //CParser pars; //pars.SetContext(this->AddRef()); @@ -91,23 +92,33 @@ //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); + m_range_expr_low = pars.ProcessText(m_checkpropval); + m_range_expr_high = pars.ProcessText(m_checkpropmaxval); + + CValue* orgprop = GetParent()->FindIdentifier(m_checkpropname); + m_range_expr_low = new COperator2Expr(VALUE_GEQ_OPERATOR,new CConstExpr(orgprop->AddRef()), + m_range_expr_low->AddRef()); + m_range_expr_high = new COperator2Expr(VALUE_LEQ_OPERATOR,new CConstExpr(orgprop->AddRef()), + m_range_expr_high->AddRef()); + orgprop->Release(); + } // 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) + if (m_range_expr_low) { - m_range_expr->Release(); - m_range_expr = NULL; + m_range_expr_low->Release(); + m_range_expr_low = NULL; } + if (m_range_expr_high) + { + m_range_expr_high->Release(); + m_range_expr_high = NULL; + } Release(); } @@ -118,13 +129,14 @@ replica->ProcessReplica(); replica->Init(); - replica->m_range_expr = NULL; + replica->m_range_expr_low = NULL; + replica->m_range_expr_high = NULL; if (replica->m_checktype==KX_PROPSENSOR_INTERVAL) { replica->PrecalculateRangeExpression(); } - - + + return replica; } @@ -146,12 +158,16 @@ //if (m_rightexpr) // m_rightexpr->Release(); - if (m_range_expr) + if (m_range_expr_low && m_range_expr_high) { - m_range_expr->Release(); - m_range_expr=NULL; + m_range_expr_low->Release(); + m_range_expr_low = NULL; } - + if (m_range_expr_high) + { + m_range_expr_high->Release(); + m_range_expr_high = NULL; + } } @@ -160,7 +176,7 @@ { bool result = CheckPropertyCondition(); bool reset = m_reset && m_level; - + m_reset = false; if (m_lastresult!=result) { @@ -173,7 +189,6 @@ bool SCA_PropertySensor::CheckPropertyCondition() { - m_recentresult=false; bool result=false; bool reverse = false; @@ -194,17 +209,17 @@ 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(orgprop) != NULL) { float f; - + if (EOF == sscanf(m_checkpropval.ReadPtr(), "%f", &f)) { //error - } + } else { result = (f == ((CFloatValue *)orgprop)->GetFloat()); } @@ -244,38 +259,26 @@ //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(); - } - } + if(m_range_expr_low && m_range_expr_high){ - - //} - - //cout << " \nSens:Prop:interval!"; /* need implementation here!!! */ + CValue* lowval = m_range_expr_low->Calculate(); + CValue* highval = m_range_expr_high->Calculate(); + const STR_String& lowprop = lowval->GetText(); + const STR_String& highprop = highval->GetText(); + if (&lowprop == &CBoolValue::sTrueString && &highprop == &CBoolValue::sTrueString) + result = true; + + lowval->Release(); + highval->Release(); + + } break; } case KX_PROPSENSOR_CHANGED: { CValue* orgprop = GetParent()->FindIdentifier(m_checkpropname); - + if (!orgprop->IsError()) { if (m_previoustext != orgprop->GetText()) Index: source/gameengine/GameLogic/SCA_PropertySensor.h =================================================================== --- source/gameengine/GameLogic/SCA_PropertySensor.h (revision 47110) +++ source/gameengine/GameLogic/SCA_PropertySensor.h (working copy) @@ -46,7 +46,8 @@ STR_String m_previoustext; bool m_lastresult; bool m_recentresult; - CExpression* m_range_expr; + CExpression* m_range_expr_low; + CExpression* m_range_expr_high; protected: @@ -62,15 +63,15 @@ }; const STR_String S_KX_PROPSENSOR_EQ_STRING; - + SCA_PropertySensor(class SCA_EventManager* eventmgr, SCA_IObject* gameobj, const STR_String& propname, 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 */