[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22716] trunk/blender/source: Option for MouseFocus sensor.

Campbell Barton ideasman42 at gmail.com
Sun Aug 23 08:17:59 CEST 2009


Revision: 22716
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22716
Author:   campbellbarton
Date:     2009-08-23 08:17:59 +0200 (Sun, 23 Aug 2009)

Log Message:
-----------
Option for MouseFocus sensor. only used when 'Mouse over any' type is set.

Previously the only way to detect if the mouse moved over a different object was to enable true-level-triggering and have a python script detect the change.

When the Pulse option is set, focusing on a different object pulses true.
Python attribute is focusSensor.usePulseFocus.

This is similar to the collision sensors pulse option where changes in the set of collision objects generates an event too.

Found this functionality missing when trying to make a logic demo that used mouse-over with overlapping objects.

Modified Paths:
--------------
    trunk/blender/source/blender/makesdna/DNA_sensor_types.h
    trunk/blender/source/blender/src/buttons_logic.c
    trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp
    trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp
    trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.h
    trunk/blender/source/gameengine/PyDoc/GameTypes.py

Modified: trunk/blender/source/blender/makesdna/DNA_sensor_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_sensor_types.h	2009-08-23 03:33:33 UTC (rev 22715)
+++ trunk/blender/source/blender/makesdna/DNA_sensor_types.h	2009-08-23 06:17:59 UTC (rev 22716)
@@ -178,6 +178,9 @@
 
 /* bMouseSensor->type: uses blender event defines */
 
+/* bMouseSensor->flag: only pulse for now */
+#define SENS_MOUSE_FOCUS_PULSE	1
+
 /* propertysensor->type */
 #define SENS_PROP_EQUAL		0
 #define SENS_PROP_NEQUAL	1

Modified: trunk/blender/source/blender/src/buttons_logic.c
===================================================================
--- trunk/blender/source/blender/src/buttons_logic.c	2009-08-23 03:33:33 UTC (rev 22715)
+++ trunk/blender/source/blender/src/buttons_logic.c	2009-08-23 06:17:59 UTC (rev 22716)
@@ -1367,10 +1367,16 @@
 			* proper compatibility with older .blend files. */
 			str= "Type %t|Left button %x1|Middle button %x2|"
 				"Right button %x4|Wheel Up %x5|Wheel Down %x6|Movement %x8|Mouse over %x16|Mouse over any%x32"; 
-			uiDefButS(block, MENU, B_REDR, str, xco+10, yco-44, width-20, 19,
+			uiDefButS(block, MENU, B_REDR, str, xco+10, yco-44, (width*0.8f)-20, 19,
 				&ms->type, 0, 31, 0, 0,
 				"Specify the type of event this mouse sensor should trigger on");
 			
+			if(ms->type==32) {
+				uiDefButBitS(block, TOG, SENS_MOUSE_FOCUS_PULSE, B_REDR, "Pulse",(short)(xco + 10) + (width*0.8f)-20,(short)(yco - 44),
+					(short)(0.20 * (width-20)), 19, &ms->flag, 0.0, 0.0, 0, 0,
+					"Moving the mouse over a different object generates a pulse");	
+			}
+			
 			yco-= ysize;
 			break;
 		}

Modified: trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp	2009-08-23 03:33:33 UTC (rev 22715)
+++ trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp	2009-08-23 06:17:59 UTC (rev 22716)
@@ -522,6 +522,7 @@
 							starty,
 							keytype,
 							trackfocus,
+							(bmouse->flag & SENS_MOUSE_FOCUS_PULSE) ? true:false,
 							kxscene,
 							kxengine,
 							gameobj); 

Modified: trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp	2009-08-23 03:33:33 UTC (rev 22715)
+++ trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp	2009-08-23 06:17:59 UTC (rev 22716)
@@ -61,12 +61,14 @@
 										 int starty,
 										 short int mousemode,
 										 int focusmode,
+										 bool bTouchPulse,
 										 KX_Scene* kxscene,
 										 KX_KetsjiEngine *kxengine,
 										 SCA_IObject* gameobj, 
 										 PyTypeObject* T)
     : SCA_MouseSensor(eventmgr, startx, starty, mousemode, gameobj, T),
 	  m_focusmode(focusmode),
+	  m_bTouchPulse(bTouchPulse),
 	  m_kxscene(kxscene),
 	  m_kxengine(kxengine)
 {
@@ -78,6 +80,7 @@
 	m_mouse_over_in_previous_frame = (m_invert)?true:false;
 	m_positive_event = false;
 	m_hitObject = 0;
+	m_hitObject_Last = NULL;
 	m_reset = true;
 	
 	m_hitPosition.setValue(0,0,0);
@@ -108,7 +111,10 @@
 			m_positive_event = true;
 			if (!m_mouse_over_in_previous_frame) {
 				result = true;
-			} 
+			}
+			else if(m_bTouchPulse && (m_hitObject != m_hitObject_Last)) {
+				result = true;
+			}
 		} 
 		if (reset) {
 			// force an event 
@@ -124,7 +130,8 @@
 	}
 
 	m_mouse_over_in_previous_frame = obHasFocus;
-
+	m_hitObject_Last = (void *)m_hitObject;
+					   
 	return result;
 }
 
@@ -390,6 +397,7 @@
 	KX_PYATTRIBUTE_RO_FUNCTION("hitObject",		KX_MouseFocusSensor, pyattr_get_hit_object),
 	KX_PYATTRIBUTE_RO_FUNCTION("hitPosition",	KX_MouseFocusSensor, pyattr_get_hit_position),
 	KX_PYATTRIBUTE_RO_FUNCTION("hitNormal",		KX_MouseFocusSensor, pyattr_get_hit_normal),
+	KX_PYATTRIBUTE_BOOL_RW("usePulseFocus",	KX_MouseFocusSensor,m_bTouchPulse),
 	{ NULL }	//Sentinel
 };
 

Modified: trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.h	2009-08-23 03:33:33 UTC (rev 22715)
+++ trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.h	2009-08-23 06:17:59 UTC (rev 22716)
@@ -49,11 +49,12 @@
 	
  public:
 	
-	KX_MouseFocusSensor(class SCA_MouseManager* keybdmgr,
+	KX_MouseFocusSensor(class SCA_MouseManager* eventmgr,
 						int startx,
 						int starty,
 						short int mousemode,
 						int focusmode,
+						bool bTouchPulse,
 						KX_Scene* kxscene,
 						KX_KetsjiEngine* kxengine,
 						SCA_IObject* gameobj,
@@ -110,6 +111,7 @@
 		
 	/* --------------------------------------------------------------------- */
 	SCA_IObject*	m_hitObject;
+	void*			m_hitObject_Last; /* only use for comparison, never access */
 
  private:
 	/**
@@ -123,6 +125,11 @@
 	bool m_mouse_over_in_previous_frame;
 
 	/**
+	 * Flags whether changes in hit object should trigger a pulse
+	 */
+	bool m_bTouchPulse;
+	
+	/**
 	 * Flags whether the previous test evaluated positive.
 	 */
 	bool m_positive_event;

Modified: trunk/blender/source/gameengine/PyDoc/GameTypes.py
===================================================================
--- trunk/blender/source/gameengine/PyDoc/GameTypes.py	2009-08-23 03:33:33 UTC (rev 22715)
+++ trunk/blender/source/gameengine/PyDoc/GameTypes.py	2009-08-23 06:17:59 UTC (rev 22716)
@@ -2472,6 +2472,8 @@
 	@type hitPosition: list (vector of 3 floats)
 	@ivar hitNormal: the worldspace normal from the face at point of intersection.
 	@type hitNormal: list (normalized vector of 3 floats)
+	@ivar usePulseFocus: When enabled, moving the mouse over a different object generates a pulse. (only used when the 'Mouse Over Any' sensor option is set)
+	@type usePulseFocus: bool
 	"""
 #{ Deprecated
 	def getHitNormal():
@@ -2533,7 +2535,7 @@
 	@ivar useMaterial: Determines if the sensor is looking for a property or material.
 						KX_True = Find material; KX_False = Find property
 	@type useMaterial: boolean
-	@ivar usePulseCollision: The last collided object.
+	@ivar usePulseCollision: When enabled, changes to the set of colliding objects generate a pulse.
 	@type usePulseCollision: bool
 	@ivar hitObject: The last collided object. (read-only)
 	@type hitObject: L{KX_GameObject} or None





More information about the Bf-blender-cvs mailing list