BGE: New Property sensor evaluation types

This patch adds "Less Than" and "Greater Than" evaluation types to the property sensor.
The Wiki Docs modifications http://wiki.blender.org/index.php/User:Lordloki/Doc:2.6/Manual/Game_Engine/Logic/Sensors/Property
Also, I have attached a screenshot and a blend to check.

Reviewers: dfelinto, moguri

Reviewed By: moguri

Differential Revision: https://developer.blender.org/D476
This commit is contained in:
Jorge Bernal 2014-06-03 13:20:59 -07:00 committed by Mitchell Stokes
parent 3144ae2c34
commit 8c16f4c7d0
Notes: blender-bot 2023-02-14 10:28:22 +01:00
Referenced by issue #41280, Discrepancy in release process
Referenced by issue #40694, Curve path messed up
27 changed files with 142 additions and 12 deletions

View File

@ -507,6 +507,18 @@ Property Sensor
:value: 5
.. data:: KX_PROPSENSOR_LESSTHAN
Activate when the property is less than the sensor value
:value: 6
.. data:: KX_PROPSENSOR_GREATERTHAN
Activate when the property is greater than the sensor value
:value: 7
------------
Radar Sensor
------------

View File

@ -1182,9 +1182,9 @@ static void draw_sensor_property(uiLayout *layout, PointerRNA *ptr)
uiItemR(row, ptr, "value_max", 0, NULL, ICON_NONE);
break;
case SENS_PROP_EQUAL:
uiItemR(layout, ptr, "value", 0, NULL, ICON_NONE);
break;
case SENS_PROP_NEQUAL:
case SENS_PROP_LESSTHAN:
case SENS_PROP_GREATERTHAN:
uiItemR(layout, ptr, "value", 0, NULL, ICON_NONE);
break;
case SENS_PROP_CHANGED:

View File

@ -202,6 +202,8 @@ typedef struct bJoystickSensor {
#define SENS_PROP_INTERVAL 2
#define SENS_PROP_CHANGED 3
#define SENS_PROP_EXPRESSION 4
#define SENS_PROP_LESSTHAN 5
#define SENS_PROP_GREATERTHAN 6
/* raysensor->axisflag */
/* flip x and y to make y default!!! */

View File

@ -478,6 +478,8 @@ static void rna_def_property_sensor(BlenderRNA *brna)
{SENS_PROP_INTERVAL, "PROPINTERVAL", 0, "Interval", ""},
{SENS_PROP_CHANGED, "PROPCHANGED", 0, "Changed", ""},
/* {SENS_PROP_EXPRESSION, "PROPEXPRESSION", 0, "Expression", ""}, NOT_USED_IN_UI */
{SENS_PROP_LESSTHAN, "PROPLESSTHAN", 0, "Less Than", ""},
{SENS_PROP_GREATERTHAN, "PROPGREATERTHAN", 0, "Greater Than", ""},
{0, NULL, 0, NULL, NULL}
};
@ -498,7 +500,7 @@ static void rna_def_property_sensor(BlenderRNA *brna)
prop = RNA_def_property(srna, "value", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "value");
RNA_def_property_ui_text(prop, "Value", "Check for this value in types in Equal or Not Equal types");
RNA_def_property_ui_text(prop, "Value", "Check for this value in types in Equal, Not Equal, Less Than and Greater Than types");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop = RNA_def_property(srna, "value_min", PROP_STRING, PROP_NONE);

View File

@ -377,6 +377,12 @@ void BL_ConvertSensors(struct Object* blenderobject,
propchecktype = SCA_PropertySensor::KX_PROPSENSOR_EXPRESSION;
/* error */
break;
case SENS_PROP_LESSTHAN:
propchecktype = SCA_PropertySensor::KX_PROPSENSOR_LESSTHAN;
break;
case SENS_PROP_GREATERTHAN:
propchecktype = SCA_PropertySensor::KX_PROPSENSOR_GREATERTHAN;
break;
default:
; /* error */
}

View File

@ -186,6 +186,13 @@ double CBoolValue::GetNumber()
int CBoolValue::GetValueType()
{
return VALUE_BOOL_TYPE;
}
const STR_String& CBoolValue::GetText()
{
return m_bool ? sTrueString : sFalseString;

View File

@ -41,6 +41,7 @@ public:
virtual const STR_String& GetText();
virtual double GetNumber();
virtual int GetValueType();
bool GetBool();
virtual void SetValue(CValue* newval);

View File

@ -82,6 +82,13 @@ double CEmptyValue::GetNumber()
int CEmptyValue::GetValueType()
{
return VALUE_EMPTY_TYPE;
}
CListValue* CEmptyValue::GetPolySoup()
{
CListValue* soup = new CListValue();

View File

@ -32,6 +32,7 @@ public:
virtual const STR_String & GetText();
virtual double GetNumber();
virtual int GetValueType();
CListValue* GetPolySoup();
virtual double* GetVector3(bool bGetTransformedVec=false);
bool IsInside(CValue* testpoint,bool bBorderInclude=true);

View File

@ -107,6 +107,13 @@ double CErrorValue::GetNumber()
int CErrorValue::GetValueType()
{
return VALUE_ERROR_TYPE;
}
const STR_String & CErrorValue::GetText()
{
return m_strErrorText;

View File

@ -27,6 +27,7 @@ class CErrorValue : public CPropValue
public:
virtual const STR_String & GetText();
virtual double GetNumber();
virtual int GetValueType();
CErrorValue();
CErrorValue(const char *errmsg);
virtual ~CErrorValue();

View File

@ -285,6 +285,13 @@ double CFloatValue::GetNumber()
int CFloatValue::GetValueType()
{
return VALUE_FLOAT_TYPE;
}
void CFloatValue::SetValue(CValue* newval)
{
m_float = (float)newval->GetNumber();

View File

@ -33,6 +33,7 @@ public:
void Configure(CValue* menuvalue);
virtual double GetNumber();
virtual int GetValueType();
virtual void SetValue(CValue* newval);
float GetFloat();
void SetFloat(float fl);

View File

@ -298,6 +298,13 @@ double CIntValue::GetNumber()
int CIntValue::GetValueType()
{
return VALUE_INT_TYPE;
}
const STR_String & CIntValue::GetText()
{
if (!m_pstrRep)

View File

@ -31,6 +31,7 @@ class CIntValue : public CPropValue
public:
virtual const STR_String& GetText();
virtual double GetNumber();
virtual int GetValueType();
cInt GetInt();
CIntValue();

View File

@ -250,6 +250,13 @@ double CListValue::GetNumber()
int CListValue::GetValueType()
{
return VALUE_LIST_TYPE;
}
void CListValue::SetModified(bool bModified)
{
CValue::SetModified(bModified);

View File

@ -40,6 +40,7 @@ public:
VALUE_OPERATOR op,
CValue* val);
virtual double GetNumber();
virtual int GetValueType();
virtual CValue* GetReplica();
public:

View File

@ -120,6 +120,13 @@ double CStringValue::GetNumber()
int CStringValue::GetValueType()
{
return VALUE_STRING_TYPE;
}
const STR_String & CStringValue::GetText()
{
return m_strString;

View File

@ -36,6 +36,7 @@ public:
virtual bool IsEqual(const STR_String & other);
virtual const STR_String & GetText();
virtual double GetNumber();
virtual int GetValueType();
virtual CValue* Calc(VALUE_OPERATOR op, CValue *val);
virtual CValue* CalcFinal(VALUE_DATA_TYPE dtype, VALUE_OPERATOR op, CValue *val);

View File

@ -494,6 +494,15 @@ void CValue::ProcessReplica() /* was AddDataToReplica in 2.48 */
}
}
int CValue::GetValueType()
{
return VALUE_NO_TYPE;
}
CValue* CValue::FindIdentifier(const STR_String& identifiername)
{

View File

@ -82,11 +82,9 @@ enum VALUE_DATA_TYPE {
VALUE_BOOL_TYPE,
VALUE_ERROR_TYPE,
VALUE_EMPTY_TYPE,
VALUE_SOLID_TYPE,
VALUE_COMBISOLID_TYPE,
VALUE_LIST_TYPE,
VALUE_VOID_TYPE,
VALUE_VECTOR_TYPE,
VALUE_MENU_TYPE,
VALUE_ACTOR_TYPE,
VALUE_MAX_TYPE //only here to provide number of types
};
@ -311,6 +309,7 @@ public:
virtual const STR_String & GetText() = 0;
virtual double GetNumber() = 0;
virtual int GetValueType(); // Get Prop value type
double* ZeroVector() { return m_sZeroVec; }
virtual double* GetVector3(bool bGetTransformedVec = false);
@ -323,7 +322,6 @@ public:
virtual void ProcessReplica();
//virtual CValue* Copy() = 0;
STR_String op2str(VALUE_OPERATOR op);
// setting / getting flags

View File

@ -162,6 +162,14 @@ double CVectorValue::GetNumber()
}
int CVectorValue::GetValueType()
{
return VALUE_VECTOR_TYPE;
}
double* CVectorValue::GetVector3(bool bGetTransformedVec)
{
if (bGetTransformedVec)

View File

@ -37,6 +37,7 @@ public:
void Configure(CValue* menuvalue);
virtual double* GetVector3(bool bGetTransformedVec=false);
virtual double GetNumber();
virtual int GetValueType();
CValue* Calc(VALUE_OPERATOR op, CValue *val) {
return val->CalcFinal(VALUE_VECTOR_TYPE, op, this);

View File

@ -59,6 +59,7 @@ public:
/// Value -> String or number
virtual const STR_String & GetText(); /* Get string description of void value (unimplemented) */
virtual double GetNumber() { return -1; }
virtual int GetValueType() { return VALUE_VOID_TYPE; }
/// Value calculation
virtual CValue* Calc(VALUE_OPERATOR op, CValue *val);

View File

@ -133,6 +133,7 @@ bool SCA_PropertySensor::CheckPropertyCondition()
{
case KX_PROPSENSOR_NOTEQUAL:
reverse = true;
/* fall-through */
case KX_PROPSENSOR_EQUAL:
{
CValue* orgprop = GetParent()->FindIdentifier(m_checkpropname);
@ -150,7 +151,7 @@ bool SCA_PropertySensor::CheckPropertyCondition()
/* 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) {
if (result==false && (orgprop->GetValueType() == VALUE_FLOAT_TYPE)) {
float f;
if (sscanf(m_checkpropval.ReadPtr(), "%f", &f) == 1) {
result = (f == ((CFloatValue *)orgprop)->GetFloat());
@ -198,11 +199,11 @@ bool SCA_PropertySensor::CheckPropertyCondition()
const float max = m_checkpropmaxval.ToFloat();
float val;
if (dynamic_cast<CStringValue *>(orgprop) == NULL) {
val = orgprop->GetNumber();
if (orgprop->GetValueType() == VALUE_STRING_TYPE){
val = orgprop->GetText().ToFloat();
}
else {
val = orgprop->GetText().ToFloat();
val = orgprop->GetNumber();
}
result = (min <= val) && (val <= max);
@ -226,6 +227,36 @@ bool SCA_PropertySensor::CheckPropertyCondition()
orgprop->Release();
//cout << " \nSens:Prop:changed!"; /* need implementation here!!! */
break;
}
case KX_PROPSENSOR_LESSTHAN:
reverse = true;
/* fall-through */
case KX_PROPSENSOR_GREATERTHAN:
{
CValue* orgprop = GetParent()->FindIdentifier(m_checkpropname);
if (!orgprop->IsError())
{
const float ref = m_checkpropval.ToFloat();
float val;
if (orgprop->GetValueType() == VALUE_STRING_TYPE){
val = orgprop->GetText().ToFloat();
}
else {
val = orgprop->GetNumber();
}
if (reverse) {
result = val < ref;
}
else {
result = val > ref;
}
}
orgprop->Release();
break;
}
default:

View File

@ -57,6 +57,8 @@ public:
KX_PROPSENSOR_INTERVAL,
KX_PROPSENSOR_CHANGED,
KX_PROPSENSOR_EXPRESSION,
KX_PROPSENSOR_LESSTHAN,
KX_PROPSENSOR_GREATERTHAN,
KX_PROPSENSOR_MAX
};

View File

@ -1538,6 +1538,8 @@ PyObject *initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack
KX_MACRO_addTypesToDict(d, KX_PROPSENSOR_INTERVAL, SCA_PropertySensor::KX_PROPSENSOR_INTERVAL);
KX_MACRO_addTypesToDict(d, KX_PROPSENSOR_CHANGED, SCA_PropertySensor::KX_PROPSENSOR_CHANGED);
KX_MACRO_addTypesToDict(d, KX_PROPSENSOR_EXPRESSION, SCA_PropertySensor::KX_PROPSENSOR_EXPRESSION);
KX_MACRO_addTypesToDict(d, KX_PROPSENSOR_LESSTHAN, SCA_PropertySensor::KX_PROPSENSOR_LESSTHAN);
KX_MACRO_addTypesToDict(d, KX_PROPSENSOR_GREATERTHAN, SCA_PropertySensor::KX_PROPSENSOR_GREATERTHAN);
/* 3. Constraint actuator */
KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_LOCX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCX);