Revision: 19733
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19733
Author:   campbellbarton
Date:     2009-04-15 15:50:56 +0200 (Wed, 15 Apr 2009)

Log Message:
-----------
BGE MouseFocusSensor
- fix for multiple viewpors broke single viewport (both work now)
- python could get uninitialized values from m_prevTargetPoint and 
m_prevSourcePoint
- getting the RayDirection for python could crash blender trying to normalize a 
zero length vector.
- added python attributes
- removed unused canvas from the MouseFocusSensor class

Modified Paths:
--------------
    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/KX_MouseFocusSensor.py

Modified: trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp     
2009-04-15 13:11:08 UTC (rev 19732)
+++ trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp     
2009-04-15 13:50:56 UTC (rev 19733)
@@ -509,7 +509,6 @@
                                                        starty,
                                                        keytype,
                                                        trackfocus,
-                                                       canvas,
                                                        kxscene,
                                                        kxengine,
                                                        gameobj); 

Modified: trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp      
2009-04-15 13:11:08 UTC (rev 19732)
+++ trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp      
2009-04-15 13:50:56 UTC (rev 19733)
@@ -61,14 +61,12 @@
                                                                                
 int starty,
                                                                                
 short int mousemode,
                                                                                
 int focusmode,
-                                                                               
 RAS_ICanvas* canvas,
                                                                                
 KX_Scene* kxscene,
                                                                                
 KX_KetsjiEngine *kxengine,
                                                                                
 SCA_IObject* gameobj, 
                                                                                
 PyTypeObject* T)
     : SCA_MouseSensor(eventmgr, startx, starty, mousemode, gameobj, T),
          m_focusmode(focusmode),
-         m_gp_canvas(canvas),
          m_kxscene(kxscene),
          m_kxengine(kxengine)
 {
@@ -81,6 +79,11 @@
        m_positive_event = false;
        m_hitObject = 0;
        m_reset = true;
+       
+       m_hitPosition.setValue(0,0,0);
+       m_prevTargetPoint.setValue(0,0,0);
+       m_prevSourcePoint.setValue(0,0,0);
+       m_hitNormal.setValue(0,0,1);
 }
 
 bool KX_MouseFocusSensor::Evaluate(CValue* event)
@@ -150,12 +153,8 @@
 
 
 
-bool KX_MouseFocusSensor::ParentObjectHasFocus()
+bool KX_MouseFocusSensor::ParentObjectHasFocusCamera(KX_Camera *cam)
 {
-       m_hitObject = 0;
-       m_hitPosition.setValue(0,0,0);
-       m_hitNormal.setValue(1,0,0);
-
        /* All screen handling in the gameengine is done by GL,
         * specifically the model/view and projection parts. The viewport
         * part is in the creator. 
@@ -187,12 +186,8 @@
         *    = 1.0 - 2(y_blender - y_lb)/height
         *
         * */
+        
        
-       MT_Vector4 frompoint;
-       MT_Vector4 topoint;
-       
-       bool result = false;
-       
        /* Because we don't want to worry about resize events, camera
         * changes and all that crap, we just determine this over and
         * over. Stop whining. We have lots of other calculations to do
@@ -200,107 +195,140 @@
         * canvas, the test is irrelevant. The 1.0 makes sure the
         * calculations don't bomb. Maybe we should explicitly guard for
         * division by 0.0...*/
-       list<class KX_Camera*>* cameras = m_kxscene->GetCameras();
        
-       // Draw the scene once for each camera with an enabled viewport
-       list<KX_Camera*>::iterator it = cameras->begin();
-       while(it != cameras->end())
+       RAS_Rect area, viewport;
+       m_kxengine->GetSceneViewport(m_kxscene, cam, area, viewport);
+       
+       /* Check if the mouse is in the viewport */
+       if ((   m_x < viewport.m_x2 &&  // less then right
+                       m_x > viewport.m_x1 &&  // more then then left
+                       m_y < viewport.m_y2 &&  // below top
+                       m_y > viewport.m_y1) == 0)      // above bottom
        {
-               if((*it)->GetViewport())
-               {
-                       KX_Camera* cam= (*it);
-               
-                       /* get the scenes current viewport. we recompute it 
because there
-                        * may be multiple cameras and 
m_kxscene->GetSceneViewport() only
-                        * has the one that was last drawn */
+               return false;
+       }
 
-                       RAS_Rect area, viewport;
-                       m_kxengine->GetSceneViewport(m_kxscene, cam, area, 
viewport);
-                       
-                       /* Check if the mouse is in the viewport */
-                       if (    m_x < viewport.m_x2 &&  // less then right
-                                       m_x > viewport.m_x1 &&  // more then 
then left
-                                       m_y < viewport.m_y2 &&  // below top
-                                       m_y > viewport.m_y1)    // above bottom
-                       {
-                               float height = float(viewport.m_y2 - 
viewport.m_y1 + 1);
-                               float width  = float(viewport.m_x2 - 
viewport.m_x1 + 1);
-                               
-                               float x_lb = float(viewport.m_x1);
-                               float y_lb = float(viewport.m_y1);
+       float height = float(viewport.m_y2 - viewport.m_y1 + 1);
+       float width  = float(viewport.m_x2 - viewport.m_x1 + 1);
+       
+       float x_lb = float(viewport.m_x1);
+       float y_lb = float(viewport.m_y1);
 
-                               /* There's some strangeness I don't fully get 
here... These values
-                                * _should_ be wrong! - see from point Z values 
*/
-                               
-                               
-                               /*      build the from and to point in 
normalized device coordinates 
-                                *      Looks like normailized device 
coordinates are [-1,1] in x [-1,1] in y
-                                *      [0,-1] in z 
-                                *      
-                                *      The actual z coordinates used don't 
have to be exact just infront and 
-                                *      behind of the near and far clip planes.
-                                */ 
-                               frompoint.setValue(     (2 * (m_x-x_lb) / 
width) - 1.0,
-                                                                       1.0 - 
(2 * (m_y - y_lb) / height),
-                                                                       0.0, /* 
nearclip, see above comments */
-                                                                       1.0 );
-                               
-                               topoint.setValue(       (2 * (m_x-x_lb) / 
width) - 1.0,
-                                                                       1.0 - 
(2 * (m_y-y_lb) / height),
-                                                                       1.0, /* 
farclip, see above comments */
-                                                                       1.0 );
+       MT_Vector4 frompoint;
+       MT_Vector4 topoint;
+       
+       /* There's some strangeness I don't fully get here... These values
+        * _should_ be wrong! - see from point Z values */
+       
+       
+       /*      build the from and to point in normalized device coordinates 
+        *      Looks like normailized device coordinates are [-1,1] in x 
[-1,1] in y
+        *      [0,-1] in z 
+        *      
+        *      The actual z coordinates used don't have to be exact just 
infront and 
+        *      behind of the near and far clip planes.
+        */ 
+       frompoint.setValue(     (2 * (m_x-x_lb) / width) - 1.0,
+                                               1.0 - (2 * (m_y - y_lb) / 
height),
+                                               0.0, /* nearclip, see above 
comments */
+                                               1.0 );
+       
+       topoint.setValue(       (2 * (m_x-x_lb) / width) - 1.0,
+                                               1.0 - (2 * (m_y-y_lb) / height),
+                                               1.0, /* farclip, see above 
comments */
+                                               1.0 );
 
-                               /* camera to world  */
-                               MT_Transform wcs_camcs_tranform = 
cam->GetWorldToCamera();
-                               if (!cam->GetCameraData()->m_perspective)
-                                       wcs_camcs_tranform.getOrigin()[2] *= 
100.0;
-                               MT_Transform cams_wcs_transform;
-                               cams_wcs_transform.invert(wcs_camcs_tranform);
-                               
-                               MT_Matrix4x4 camcs_wcs_matrix = 
MT_Matrix4x4(cams_wcs_transform);
+       /* camera to world  */
+       MT_Transform wcs_camcs_tranform = cam->GetWorldToCamera();
+       if (!cam->GetCameraData()->m_perspective)
+               wcs_camcs_tranform.getOrigin()[2] *= 100.0;
+       MT_Transform cams_wcs_transform;
+       cams_wcs_transform.invert(wcs_camcs_tranform);
+       
+       MT_Matrix4x4 camcs_wcs_matrix = MT_Matrix4x4(cams_wcs_transform);
 
-                               /* badly defined, the first time round.... I 
wonder why... I might
-                                * want to guard against floating point errors 
here.*/
-                               MT_Matrix4x4 clip_camcs_matrix = 
MT_Matrix4x4(cam->GetProjectionMatrix());
-                               clip_camcs_matrix.invert();
+       /* badly defined, the first time round.... I wonder why... I might
+        * want to guard against floating point errors here.*/
+       MT_Matrix4x4 clip_camcs_matrix = 
MT_Matrix4x4(cam->GetProjectionMatrix());
+       clip_camcs_matrix.invert();
 
-                               /* shoot-points: clip to cam to wcs . win to 
clip was already done.*/
-                               frompoint = clip_camcs_matrix * frompoint;
-                               topoint   = clip_camcs_matrix * topoint;
-                               frompoint = camcs_wcs_matrix * frompoint;
-                               topoint   = camcs_wcs_matrix * topoint;
-                               
-                               /* from hom wcs to 3d wcs: */
-                               m_prevSourcePoint.setValue(     
frompoint[0]/frompoint[3],
-                                                                               
        frompoint[1]/frompoint[3],
-                                                                               
        frompoint[2]/frompoint[3]); 
-                               
-                               m_prevTargetPoint.setValue(     
topoint[0]/topoint[3],
-                                                                               
        topoint[1]/topoint[3],
-                                                                               
        topoint[2]/topoint[3]); 
-                               
-                               /* 2. Get the object from PhysicsEnvironment */
-                               /* Shoot! Beware that the first argument here 
is an
-                                * ignore-object. We don't ignore anything... */
-                               KX_IPhysicsController* physics_controller = 
cam->GetPhysicsController();
-                               PHY_IPhysicsEnvironment* physics_environment = 
m_kxscene->GetPhysicsEnvironment();
+       /* shoot-points: clip to cam to wcs . win to clip was already done.*/
+       frompoint = clip_camcs_matrix * frompoint;
+       topoint   = clip_camcs_matrix * topoint;
+       frompoint = camcs_wcs_matrix * frompoint;
+       topoint   = camcs_wcs_matrix * topoint;
+       
+       /* from hom wcs to 3d wcs: */
+       m_prevSourcePoint.setValue(     frompoint[0]/frompoint[3],
+                                                               
frompoint[1]/frompoint[3],
+                                                               
frompoint[2]/frompoint[3]); 
+       
+       m_prevTargetPoint.setValue(     topoint[0]/topoint[3],
+                                                               
topoint[1]/topoint[3],
+                                                               
topoint[2]/topoint[3]); 
+       
+       /* 2. Get the object from PhysicsEnvironment */
+       /* Shoot! Beware that the first argument here is an
+        * ignore-object. We don't ignore anything... */
+       KX_IPhysicsController* physics_controller = cam->GetPhysicsController();
+       PHY_IPhysicsEnvironment* physics_environment = 
m_kxscene->GetPhysicsEnvironment();
 
-                               KX_RayCast::Callback<KX_MouseFocusSensor> 
callback(this,physics_controller);
-                                
-                               KX_RayCast::RayTest(physics_environment, 
m_prevSourcePoint, m_prevTargetPoint, callback);
-                               
-                               if (m_hitObject) {
-                                       result= true;
-                                       break;
-                               }
-                       }
-               }
+       KX_RayCast::Callback<KX_MouseFocusSensor> 
callback(this,physics_controller);
+        
+       KX_RayCast::RayTest(physics_environment, m_prevSourcePoint, 
m_prevTargetPoint, callback);
+       
+       if (m_hitObject)
+               return true;
+       
+       return false;
+}
+
+bool KX_MouseFocusSensor::ParentObjectHasFocus()
+{
+       m_hitObject = 0;
+       m_hitPosition.setValue(0,0,0);
+       m_hitNormal.setValue(1,0,0);
+       
+       KX_Camera *cam= m_kxscene->GetActiveCamera();
+       
+       if(ParentObjectHasFocusCamera(cam))
+               return true;
+
+       list<class KX_Camera*>* cameras = m_kxscene->GetCameras();
+       list<KX_Camera*>::iterator it = cameras->begin();
+       
+       while(it != cameras->end())
+       {
+               if(((*it) != cam) && (*it)->GetViewport())
+                       if (ParentObjectHasFocusCamera(*it))
+                               return true;
+               
                it++;
        }
        
-       return result;
+       return false;
 }
 
+const MT_Point3& KX_MouseFocusSensor::RaySource() const
+{
+       return m_prevSourcePoint;
+}
+
+const MT_Point3& KX_MouseFocusSensor::RayTarget() const
+{
+       return m_prevTargetPoint;
+}
+
+const MT_Point3& KX_MouseFocusSensor::HitPosition() const
+{
+       return m_hitPosition;
+}
+
+const MT_Vector3& KX_MouseFocusSensor::HitNormal() const
+{
+       return m_hitNormal;
+}
+
 /* ------------------------------------------------------------------------- */
 /* Python functions                                                          */
 /* ------------------------------------------------------------------------- */
@@ -342,11 +370,16 @@
        {"getHitNormal",(PyCFunction) 
KX_MouseFocusSensor::sPyGetHitNormal,METH_NOARGS, 
(PY_METHODCHAR)GetHitNormal_doc},
        {"getRayDirection",(PyCFunction) 
KX_MouseFocusSensor::sPyGetRayDirection,METH_NOARGS, 
(PY_METHODCHAR)GetRayDirection_doc},
 
-
        {NULL,NULL} //Sentinel
 };
 

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to