[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15333] trunk/blender/source: BGE patch: Add level option on sensor and fix sensor reset.

Diego Hernan Borghetti bdiego at gmail.com
Tue Jun 24 18:53:39 CEST 2008


On Mon, 23 Jun 2008, Benoit Bolsee wrote:

Hi Benoit:

> Revision: 15333
>          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15333
> Author:   ben2610
> Date:     2008-06-23 22:26:48 +0200 (Mon, 23 Jun 2008)
>
> Log Message:
> -----------
> BGE patch: Add level option on sensor and fix sensor reset.

Too many code here, so it's better just ask.. is this fix for 2.47 branch 
? or just the new code of the previous revisions (15327, 15306, 16260)

I don't know enought about the GE, so if this is a fix for the 2.47, can 
you "point" me in the right direction, please ? ;)

>
> Level option is now available on all sensors but is only implemented on
> mouse and keyboard sensors. The purpose of that option is to make
> the sensor react on level rather than edge by default. It's only
> applicable to state engine system when there is a state transition:
> the sensor will generate a pulse if the condition is met from the
> start of the state. Normally, the keyboard sensor generate a pulse
> only when the key is pressed and not when the key is already pressed.
> This patch allows to select this behavior.
> The second part of the patch corrects the reset method for sensors
> with inverted output.
>
> Modified Paths:
> --------------
>    trunk/blender/source/blender/makesdna/DNA_sensor_types.h
>    trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp
>    trunk/blender/source/gameengine/GameLogic/SCA_ISensor.cpp
>    trunk/blender/source/gameengine/GameLogic/SCA_ISensor.h
>    trunk/blender/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
>    trunk/blender/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp
>    trunk/blender/source/gameengine/GameLogic/SCA_MouseSensor.cpp
>    trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.cpp
>    trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp
>    trunk/blender/source/gameengine/Ketsji/KX_RaySensor.cpp
>
> Modified: trunk/blender/source/blender/makesdna/DNA_sensor_types.h
> ===================================================================
> --- trunk/blender/source/blender/makesdna/DNA_sensor_types.h	2008-06-23 18:09:51 UTC (rev 15332)
> +++ trunk/blender/source/blender/makesdna/DNA_sensor_types.h	2008-06-23 20:26:48 UTC (rev 15333)
> @@ -144,7 +144,7 @@
>
> 	/* just add here, to avoid align errors... */
> 	short invert; /* Whether or not to invert the output. */
> -	short freq2;  /* The negative pulsing frequency? Not used anymore... */
> +	short level;  /* Whether the sensor is level base (edge by default) */
> 	int pad;
> } bSensor;
>
>
> Modified: trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp
> ===================================================================
> --- trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp	2008-06-23 18:09:51 UTC (rev 15332)
> +++ trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp	2008-06-23 20:26:48 UTC (rev 15333)
> @@ -251,6 +251,7 @@
> 	bool neg_pulsemode = false;
> 	int frequency = 0;
> 	bool invert = false;
> +	bool level = false;
>
> 	while(sens)
> 	{
> @@ -263,7 +264,8 @@
>
> 		frequency = sens->freq;
> 		invert    = !(sens->invert == 0);
> -
> +		level     = !(sens->level == 0);
> +
> 		switch (sens->type)
> 		{
> 		case  SENS_ALWAYS:
> @@ -711,6 +713,7 @@
> 									 neg_pulsemode,
> 									 frequency);
> 			gamesensor->SetInvert(invert);
> +			gamesensor->SetLevel(level);
> 			gamesensor->SetName(STR_String(sens->name));
>
> 			gameobj->AddSensor(gamesensor);
>
> Modified: trunk/blender/source/gameengine/GameLogic/SCA_ISensor.cpp
> ===================================================================
> --- trunk/blender/source/gameengine/GameLogic/SCA_ISensor.cpp	2008-06-23 18:09:51 UTC (rev 15332)
> +++ trunk/blender/source/gameengine/GameLogic/SCA_ISensor.cpp	2008-06-23 20:26:48 UTC (rev 15333)
> @@ -55,6 +55,7 @@
> 	m_links = 0;
> 	m_suspended = false;
> 	m_invert = false;
> +	m_level = false;
> 	m_pos_ticks = 0;
> 	m_neg_ticks = 0;
> 	m_pos_pulsemode = false;
> @@ -95,7 +96,11 @@
> 	m_invert = inv;
> }
>
> +void SCA_ISensor::SetLevel(bool lvl) {
> +	m_level = lvl;
> +}
>
> +
> float SCA_ISensor::GetNumber() {
> 	return IsPositiveTrigger();
> }
> @@ -177,6 +182,10 @@
> 	 METH_VARARGS, GetInvert_doc},
> 	{"setInvert", (PyCFunction) SCA_ISensor::sPySetInvert,
> 	 METH_VARARGS, SetInvert_doc},
> +	{"getLevel", (PyCFunction) SCA_ISensor::sPyGetLevel,
> +	 METH_VARARGS, GetLevel_doc},
> +	{"setLevel", (PyCFunction) SCA_ISensor::sPySetLevel,
> +	 METH_VARARGS, SetLevel_doc},
> 	{NULL,NULL} //Sentinel
> };
>
> @@ -328,6 +337,31 @@
> 	Py_Return;
> }
>
> +char SCA_ISensor::GetLevel_doc[] =
> +"getLevel()\n"
> +"\tReturns whether this sensor is a level detector or a edge detector.\n"
> +"\tIt makes a difference only in case of logic state transition (state actuator).\n"
> +"\tA level detector will immediately generate a pulse if the condition for the\n"
> +"\tdetector is met when entering the state. A edge detector will wait for an off-on\n"
> +"\ttransition to occur.\n"
> +"\tOnly some sensors implement this feature: keyboard.\n";
> +PyObject* SCA_ISensor::PyGetLevel(PyObject* self, PyObject* args, PyObject* kwds)
> +{
> +	return BoolToPyArg(m_level);
> +}
> +
> +char SCA_ISensor::SetLevel_doc[] =
> +"setLevel(level?)\n"
> +"\t- level?: Detect level instead of edge? (KX_TRUE, KX_FALSE)\n"
> +"\tSet whether to detect level or edge transition when entering a state.\n";
> +PyObject* SCA_ISensor::PySetLevel(PyObject* self, PyObject* args, PyObject* kwds)
> +{
> +	int pyarg = 0;
> +	if(!PyArg_ParseTuple(args, "i", &pyarg)) { return NULL; }
> +	m_level = PyArgToBool(pyarg);
> +	Py_Return;
> +}
> +
> char SCA_ISensor::GetUseNegPulseMode_doc[] =
> "getUseNegPulseMode()\n"
> "\tReturns whether negative pulse mode is active.\n";
>
> Modified: trunk/blender/source/gameengine/GameLogic/SCA_ISensor.h
> ===================================================================
> --- trunk/blender/source/gameengine/GameLogic/SCA_ISensor.h	2008-06-23 18:09:51 UTC (rev 15332)
> +++ trunk/blender/source/gameengine/GameLogic/SCA_ISensor.h	2008-06-23 20:26:48 UTC (rev 15333)
> @@ -61,6 +61,9 @@
> 	/** invert the output signal*/
> 	bool m_invert;
>
> +	/** detect level instead of edge*/
> +	bool m_level;
> +
> 	/** Sensor must ignore updates? */
> 	bool m_suspended;
>
> @@ -105,6 +108,8 @@
> 	virtual void Delete() { Release(); }
> 	/** Set inversion of pulses on or off. */
> 	void SetInvert(bool inv);
> +	/** set the level detection on or off */
> +	void SetLevel(bool lvl);
>
> 	void RegisterToManager();
> 	virtual float GetNumber();
> @@ -134,6 +139,8 @@
> 	KX_PYMETHOD_DOC(SCA_ISensor,SetUseNegPulseMode);
> 	KX_PYMETHOD_DOC(SCA_ISensor,GetInvert);
> 	KX_PYMETHOD_DOC(SCA_ISensor,SetInvert);
> +	KX_PYMETHOD_DOC(SCA_ISensor,GetLevel);
> +	KX_PYMETHOD_DOC(SCA_ISensor,SetLevel);
>
> };
>
>
> Modified: trunk/blender/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
> ===================================================================
> --- trunk/blender/source/gameengine/GameLogic/SCA_JoystickSensor.cpp	2008-06-23 18:09:51 UTC (rev 15332)
> +++ trunk/blender/source/gameengine/GameLogic/SCA_JoystickSensor.cpp	2008-06-23 20:26:48 UTC (rev 15333)
> @@ -69,7 +69,7 @@
>
> void SCA_JoystickSensor::Init()
> {
> -	m_istrig=0;
> +	m_istrig=(m_invert)?1:0;
> }
>
> SCA_JoystickSensor::~SCA_JoystickSensor()
>
> Modified: trunk/blender/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp
> ===================================================================
> --- trunk/blender/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp	2008-06-23 18:09:51 UTC (rev 15332)
> +++ trunk/blender/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp	2008-06-23 20:26:48 UTC (rev 15333)
> @@ -77,7 +77,7 @@
> 	// by the state engine. It reinitializes the sensor as if it was just created.
> 	// However, if the target key is pressed when the sensor is reactivated, it
> 	// will not generated an event (see remark in Evaluate()).
> -	m_val = 0;
> +	m_val = (m_invert)?1:0;
> }
>
> CValue* SCA_KeyboardSensor::GetReplica()
> @@ -176,10 +176,10 @@
> 				{
> 					if (m_val == 0)
> 					{
> -						//see comment below
> -						//m_val = 1;
> -						//result = true;
> -						;
> +						if (m_level) {
> +							m_val = 1;
> +							result = true;
> +						}
> 					}
> 				} else
> 				{
> @@ -229,15 +229,11 @@
> 					{
> 						if (m_val == 0)
> 						{
> -							//hmm, this abnormal situation may occur in the following cases:
> -							//- the key was pressed while the scene was suspended
> -							//- this is a new scene and the key is active from the start
> -							//In the second case, it's dangerous to activate the sensor
> -							//(think of a key to go to next scene)
> -							//What we really need is a edge/level flag in the key sensor
> -							//m_val = 1;
> -							//result = true;
> -							;
> +							if (m_level)
> +							{
> +								m_val = 1;
> +								result = true;
> +							}
> 						}
> 					}
> 				}
>
> Modified: trunk/blender/source/gameengine/GameLogic/SCA_MouseSensor.cpp
> ===================================================================
> --- trunk/blender/source/gameengine/GameLogic/SCA_MouseSensor.cpp	2008-06-23 18:09:51 UTC (rev 15332)
> +++ trunk/blender/source/gameengine/GameLogic/SCA_MouseSensor.cpp	2008-06-23 20:26:48 UTC (rev 15333)
> @@ -83,7 +83,7 @@
>
> void SCA_MouseSensor::Init()
> {
> -	m_val = 0; /* stores the latest attribute */
> +	m_val = (m_invert)?1:0; /* stores the latest attribute */
> }
>
> SCA_MouseSensor::~SCA_MouseSensor()
> @@ -168,10 +168,11 @@
> 					{
> 						if (m_val == 0)
> 						{
> -							//dangerous
> -							//m_val = 1;
> -							//result = true;
> -							;
> +							if (m_level)
> +							{
> +								m_val = 1;
> +								result = true;
> +							}
> 						}
> 					} else
> 					{
>
> Modified: trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.cpp
> ===================================================================
> --- trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.cpp	2008-06-23 18:09:51 UTC (rev 15332)
> +++ trunk/blender/source/gameengine/GameLogic/SCA_PropertySensor.cpp	2008-06-23 20:26:48 UTC (rev 15333)
> @@ -54,7 +54,6 @@
> 	  m_checkpropval(propval),
> 	  m_checkpropmaxval(propmaxval),
> 	  m_checkpropname(propname),
> -	  m_lastresult(false),
> 	  m_range_expr(NULL)
> {
> 	//CParser pars;
> @@ -78,6 +77,7 @@
> void SCA_PropertySensor::Init()
> {
> 	m_recentresult = false;
> +	m_lastresult = m_invert?true:false;
> }
>
> void SCA_PropertySensor::PrecalculateRangeExpression()
>
> Modified: trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp
> ===================================================================
> --- trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp	2008-06-23 18:09:51 UTC (rev 15332)
> +++ trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp	2008-06-23 20:26:48 UTC (rev 15333)
> @@ -74,7 +74,7 @@
>
> void KX_MouseFocusSensor::Init()
> {
> -	m_mouse_over_in_previous_frame = false;
> +	m_mouse_over_in_previous_frame = (m_invert)?true:false;
> 	m_positive_event = false;
> 	m_hitObject = 0;
> }
> @@ -92,13 +92,13 @@
> 		obHasFocus = ParentObjectHasFocus();
>
> 		if (!obHasFocus) {
> +			m_positive_event = false;
> 			if (m_mouse_over_in_previous_frame) {
> -					m_positive_event = false;
> -					result = true;
> +				result = true;
> 			}
> 		} else {
> +			m_positive_event = true;
> 			if (!m_mouse_over_in_previous_frame) {
> -				m_positive_event = true;
> 				result = true;
> 			}
> 		}
>
> Modified: trunk/blender/source/gameengine/Ketsji/KX_RaySensor.cpp
> ===================================================================
> --- trunk/blender/source/gameengine/Ketsji/KX_RaySensor.cpp	2008-06-23 18:09:51 UTC (rev 15332)
> +++ trunk/blender/source/gameengine/Ketsji/KX_RaySensor.cpp	2008-06-23 20:26:48 UTC (rev 15333)
> @@ -69,7 +69,7 @@
>
> void KX_RaySensor::Init()
> {
> -	m_bTriggered = false;
> +	m_bTriggered = (m_invert)?true:false;
> 	m_rayHit = false;
> 	m_hitObject = NULL;
> }
>
>
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>

-- 
 			Diego


More information about the Bf-committers mailing list