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


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to