[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16589] trunk/blender/source/gameengine: Fix for bug #3858: the game engine mouse focus sensor did not work

Brecht Van Lommel brechtvanlommel at pandora.be
Thu Sep 18 03:46:29 CEST 2008


Revision: 16589
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16589
Author:   blendix
Date:     2008-09-18 03:46:28 +0200 (Thu, 18 Sep 2008)

Log Message:
-----------
Fix for bug #3858: the game engine mouse focus sensor did not work
correct if there was more than one camera. It shoots rays from the
active camera, but used the viewport from whichever camera was drawn
last, now it uses the correct vieport.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp
    trunk/blender/source/gameengine/Converter/KX_ConvertSensors.h
    trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
    trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.h
    trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp
    trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.h

Modified: trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2008-09-18 00:51:51 UTC (rev 16588)
+++ trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2008-09-18 01:46:28 UTC (rev 16589)
@@ -2471,7 +2471,7 @@
 		struct Object* blenderobj = converter->FindBlenderObject(gameobj);
 		int layerMask = (groupobj.find(blenderobj) == groupobj.end()) ? activeLayerBitInfo : 0;
 		bool isInActiveLayer = (blenderobj->lay & layerMask)!=0;
-		BL_ConvertSensors(blenderobj,gameobj,logicmgr,kxscene,keydev,executePriority,layerMask,isInActiveLayer,canvas,converter);
+		BL_ConvertSensors(blenderobj,gameobj,logicmgr,kxscene,ketsjiEngine,keydev,executePriority,layerMask,isInActiveLayer,canvas,converter);
 		// set the init state to all objects
 		gameobj->SetInitState((blenderobj->init_state)?blenderobj->init_state:blenderobj->state);
 	}

Modified: trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp	2008-09-18 00:51:51 UTC (rev 16588)
+++ trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp	2008-09-18 01:46:28 UTC (rev 16589)
@@ -92,6 +92,7 @@
 					   class KX_GameObject* gameobj,
 					   SCA_LogicManager* logicmgr,
 					   KX_Scene* kxscene,
+					   KX_KetsjiEngine* kxengine,
 					   SCA_IInputDevice* keydev,
 					   int & executePriority,
 					   int activeLayerBitInfo,
@@ -508,6 +509,7 @@
 							trackfocus,
 							canvas,
 							kxscene,
+							kxengine,
 							gameobj); 
 					}
 				} else {

Modified: trunk/blender/source/gameengine/Converter/KX_ConvertSensors.h
===================================================================
--- trunk/blender/source/gameengine/Converter/KX_ConvertSensors.h	2008-09-18 00:51:51 UTC (rev 16588)
+++ trunk/blender/source/gameengine/Converter/KX_ConvertSensors.h	2008-09-18 01:46:28 UTC (rev 16589)
@@ -33,6 +33,7 @@
 	   class KX_GameObject* gameobj,
 	   class SCA_LogicManager* logicmgr,
 	   class KX_Scene* kxscene,
+	   class KX_KetsjiEngine* kxengine,
 	   class SCA_IInputDevice* keydev,
 	   int & executePriority ,
 	   int activeLayerBitInfo,

Modified: trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp	2008-09-18 00:51:51 UTC (rev 16588)
+++ trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp	2008-09-18 01:46:28 UTC (rev 16589)
@@ -299,7 +299,7 @@
 		list<KX_Camera*>::iterator it;
 		for(it = cameras->begin(); it != cameras->end(); it++)
 		{
-			SetupViewport(scene, (*it), area, viewport);
+			GetSceneViewport(scene, (*it), area, viewport);
 
 			if(!doclear) {
 				clearvp = viewport;
@@ -894,7 +894,7 @@
 	m_overrideCamFar = far;
 }
 
-void KX_KetsjiEngine::SetupViewport(KX_Scene *scene, KX_Camera* cam, RAS_Rect& area, RAS_Rect& viewport)
+void KX_KetsjiEngine::GetSceneViewport(KX_Scene *scene, KX_Camera* cam, RAS_Rect& area, RAS_Rect& viewport)
 {
 	// In this function we make sure the rasterizer settings are upto
 	// date. We compute the viewport so that logic
@@ -1001,7 +1001,7 @@
 	if (!cam)
 		return;
 
-	SetupViewport(scene, cam, area, viewport);
+	GetSceneViewport(scene, cam, area, viewport);
 
 	// store the computed viewport in the scene
 	scene->SetSceneViewport(viewport);	

Modified: trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.h	2008-09-18 00:51:51 UTC (rev 16588)
+++ trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.h	2008-09-18 01:46:28 UTC (rev 16589)
@@ -179,7 +179,6 @@
 	/** Blue component of framing bar color. */
 	float					m_overrideFrameColorB;
 
-	void					SetupViewport(KX_Scene *scene, KX_Camera* cam, RAS_Rect& area, RAS_Rect& viewport);
 	void					RenderFrame(KX_Scene* scene, KX_Camera* cam);
 	void					PostRenderFrame();
 	void					RenderDebugProperties();
@@ -230,6 +229,8 @@
 	void			SuspendScene(const STR_String& scenename);
 	void			ResumeScene(const STR_String& scenename);
 
+	void			GetSceneViewport(KX_Scene* scene, KX_Camera* cam, RAS_Rect& area, RAS_Rect& viewport);
+
 	void SetDrawType(int drawingtype);
 	void SetCameraZoom(float camzoom);
 	

Modified: trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp	2008-09-18 00:51:51 UTC (rev 16588)
+++ trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp	2008-09-18 01:46:28 UTC (rev 16589)
@@ -62,12 +62,14 @@
 										 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_kxscene(kxscene),
+	  m_kxengine(kxengine)
 {
 	Init();
 }
@@ -193,21 +195,24 @@
 	 * calculations don't bomb. Maybe we should explicitly guard for
 	 * division by 0.0...*/
 
-	/**
-	 * Get the scenes current viewport.
-	 */
+	KX_Camera* cam = m_kxscene->GetActiveCamera();
 
-	const RAS_Rect & viewport = m_kxscene->GetSceneViewport();
+	/* 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);
 	
 	float x_lb = float(viewport.m_x1);
 	float y_lb = float(viewport.m_y1);
 
-	KX_Camera* cam = m_kxscene->GetActiveCamera();
 	/* There's some strangeness I don't fully get here... These values
 	 * _should_ be wrong! */
+	
 
 	/* old: */
 	float nearclip = 0.0;

Modified: trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.h	2008-09-18 00:51:51 UTC (rev 16588)
+++ trunk/blender/source/gameengine/Ketsji/KX_MouseFocusSensor.h	2008-09-18 01:46:28 UTC (rev 16589)
@@ -56,6 +56,7 @@
 						int focusmode,
 						RAS_ICanvas* canvas,
 						KX_Scene* kxscene,
+						KX_KetsjiEngine* kxengine,
 						SCA_IObject* gameobj,
 						PyTypeObject* T=&Type );
 
@@ -143,12 +144,6 @@
 
 
 	/**
-	 * Ref to the engine, for retrieving a reference to the current
-	 * scene.  */
-	class KX_KetsjiEngine* m_engine;
-
-
-	/**
 	 * The active canvas. The size of this canvas determines a part of
 	 * the start position of the picking ray.  */
 	RAS_ICanvas* m_gp_canvas;
@@ -158,6 +153,9 @@
 	 * determines a part of the start location of the picking ray.  */
 	KX_Scene* m_kxscene;
 
+	/**
+	 * The KX engine is needed for computing the viewport */
+	KX_KetsjiEngine* m_kxengine;
 };
 
 #endif //__KX_MOUSESENSOR





More information about the Bf-blender-cvs mailing list