[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19711] trunk/blender/source/gameengine/ Ketsji/KX_MouseFocusSensor.cpp: BGE Bugfix

Campbell Barton ideasman42 at gmail.com
Tue Apr 14 05:08:10 CEST 2009


Revision: 19711
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19711
Author:   campbellbarton
Date:     2009-04-14 05:08:09 +0200 (Tue, 14 Apr 2009)

Log Message:
-----------
BGE Bugfix
[#17678] "Mouse over" sensor broken when using viewports

Loop over all the scenes camera viewports and check the mouse is inside the viewport before casting a ray.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp

Modified: trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp	2009-04-13 20:08:33 UTC (rev 19710)
+++ trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp	2009-04-14 03:08:09 UTC (rev 19711)
@@ -150,11 +150,11 @@
 
 
 
-bool KX_MouseFocusSensor::ParentObjectHasFocus(void)
+bool KX_MouseFocusSensor::ParentObjectHasFocus()
 {
 	m_hitObject = 0;
-	m_hitPosition = MT_Vector3(0,0,0);
-	m_hitNormal =	MT_Vector3(1,0,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
@@ -188,6 +188,11 @@
 	 *
 	 * */
 	
+	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
@@ -195,96 +200,105 @@
 	 * 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...*/
-
-	KX_Camera* cam = m_kxscene->GetActiveCamera();
-
-	/* 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 */
-
-	RAS_Rect area, viewport;
-	m_kxengine->GetSceneViewport(m_kxscene, cam, area, viewport);
-
-	float height = float(viewport.m_y2 - viewport.m_y1 + 1);
-	float width  = float(viewport.m_x2 - viewport.m_x1 + 1);
+	list<class KX_Camera*>* cameras = m_kxscene->GetCameras();
 	
-	float x_lb = float(viewport.m_x1);
-	float y_lb = float(viewport.m_y1);
+	// Draw the scene once for each camera with an enabled viewport
+	list<KX_Camera*>::iterator it = cameras->begin();
+	while(it != cameras->end())
+	{
+		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 */
 
-	/* There's some strangeness I don't fully get here... These values
-	 * _should_ be wrong! */
-	
+			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);
 
-	/* old: */
-	float nearclip = 0.0;
-	float farclip = 1.0;
+				/* 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 );
 
-	/*	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.
-	 */ 
-	MT_Vector4 frompoint = MT_Vector4( 
-		(2 * (m_x-x_lb) / width) - 1.0,
-		1.0 - (2 * (m_y - y_lb) / height),
-		nearclip,
-		1.0
-	);
-	MT_Vector4 topoint = MT_Vector4( 
-		(2 * (m_x-x_lb) / width) - 1.0,
-		1.0 - (2 * (m_y-y_lb) / height),
-		farclip,
-		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;
+				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;
+				}
+			}
+		}
+		it++;
+	}
 	
-	/* from hom wcs to 3d wcs: */
-	MT_Point3 frompoint3 = MT_Point3(frompoint[0]/frompoint[3], 
-									 frompoint[1]/frompoint[3], 
-									 frompoint[2]/frompoint[3]); 
-	MT_Point3 topoint3 = MT_Point3(topoint[0]/topoint[3], 
-								   topoint[1]/topoint[3], 
-								   topoint[2]/topoint[3]); 
-	m_prevTargetPoint = topoint3;
-	m_prevSourcePoint = frompoint3;
-	
-	/* 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();
-
-	bool result = false;
-
-	KX_RayCast::Callback<KX_MouseFocusSensor> callback(this,physics_controller);
-	KX_RayCast::RayTest(physics_environment, frompoint3, topoint3, callback);
-	
-	result = (m_hitObject!=0);
-
 	return result;
-
 }
 
 /* ------------------------------------------------------------------------- */





More information about the Bf-blender-cvs mailing list