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:
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
|
@ -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
|
||||
------------
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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!!! */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
}
|
||||
|
|
|
@ -186,6 +186,13 @@ double CBoolValue::GetNumber()
|
|||
|
||||
|
||||
|
||||
int CBoolValue::GetValueType()
|
||||
{
|
||||
return VALUE_BOOL_TYPE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
const STR_String& CBoolValue::GetText()
|
||||
{
|
||||
return m_bool ? sTrueString : sFalseString;
|
||||
|
|
|
@ -41,6 +41,7 @@ public:
|
|||
|
||||
virtual const STR_String& GetText();
|
||||
virtual double GetNumber();
|
||||
virtual int GetValueType();
|
||||
bool GetBool();
|
||||
virtual void SetValue(CValue* newval);
|
||||
|
||||
|
|
|
@ -82,6 +82,13 @@ double CEmptyValue::GetNumber()
|
|||
|
||||
|
||||
|
||||
int CEmptyValue::GetValueType()
|
||||
{
|
||||
return VALUE_EMPTY_TYPE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
CListValue* CEmptyValue::GetPolySoup()
|
||||
{
|
||||
CListValue* soup = new CListValue();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -107,6 +107,13 @@ double CErrorValue::GetNumber()
|
|||
|
||||
|
||||
|
||||
int CErrorValue::GetValueType()
|
||||
{
|
||||
return VALUE_ERROR_TYPE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
const STR_String & CErrorValue::GetText()
|
||||
{
|
||||
return m_strErrorText;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -285,6 +285,13 @@ double CFloatValue::GetNumber()
|
|||
|
||||
|
||||
|
||||
int CFloatValue::GetValueType()
|
||||
{
|
||||
return VALUE_FLOAT_TYPE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void CFloatValue::SetValue(CValue* newval)
|
||||
{
|
||||
m_float = (float)newval->GetNumber();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -298,6 +298,13 @@ double CIntValue::GetNumber()
|
|||
|
||||
|
||||
|
||||
int CIntValue::GetValueType()
|
||||
{
|
||||
return VALUE_INT_TYPE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
const STR_String & CIntValue::GetText()
|
||||
{
|
||||
if (!m_pstrRep)
|
||||
|
|
|
@ -31,6 +31,7 @@ class CIntValue : public CPropValue
|
|||
public:
|
||||
virtual const STR_String& GetText();
|
||||
virtual double GetNumber();
|
||||
virtual int GetValueType();
|
||||
|
||||
cInt GetInt();
|
||||
CIntValue();
|
||||
|
|
|
@ -250,6 +250,13 @@ double CListValue::GetNumber()
|
|||
|
||||
|
||||
|
||||
int CListValue::GetValueType()
|
||||
{
|
||||
return VALUE_LIST_TYPE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void CListValue::SetModified(bool bModified)
|
||||
{
|
||||
CValue::SetModified(bModified);
|
||||
|
|
|
@ -40,6 +40,7 @@ public:
|
|||
VALUE_OPERATOR op,
|
||||
CValue* val);
|
||||
virtual double GetNumber();
|
||||
virtual int GetValueType();
|
||||
virtual CValue* GetReplica();
|
||||
|
||||
public:
|
||||
|
|
|
@ -120,6 +120,13 @@ double CStringValue::GetNumber()
|
|||
|
||||
|
||||
|
||||
int CStringValue::GetValueType()
|
||||
{
|
||||
return VALUE_STRING_TYPE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
const STR_String & CStringValue::GetText()
|
||||
{
|
||||
return m_strString;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -162,6 +162,14 @@ double CVectorValue::GetNumber()
|
|||
}
|
||||
|
||||
|
||||
|
||||
int CVectorValue::GetValueType()
|
||||
{
|
||||
return VALUE_VECTOR_TYPE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
double* CVectorValue::GetVector3(bool bGetTransformedVec)
|
||||
{
|
||||
if (bGetTransformedVec)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -57,6 +57,8 @@ public:
|
|||
KX_PROPSENSOR_INTERVAL,
|
||||
KX_PROPSENSOR_CHANGED,
|
||||
KX_PROPSENSOR_EXPRESSION,
|
||||
KX_PROPSENSOR_LESSTHAN,
|
||||
KX_PROPSENSOR_GREATERTHAN,
|
||||
KX_PROPSENSOR_MAX
|
||||
};
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue