[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16510] trunk/blender/source:

Brecht Van Lommel brechtvanlommel at pandora.be
Sun Sep 14 02:32:18 CEST 2008


Revision: 16510
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16510
Author:   blendix
Date:     2008-09-14 02:32:18 +0200 (Sun, 14 Sep 2008)

Log Message:
-----------

Various game engine fixes:

* Fix issue with add transparency mode with blender materials.
* Possible fix at frontface flip in the game engine.
* Fix color buffering clearing for multiple viewports, it used
  to clear as if there was one.
* Fix for zoom level in user defined viewports, it was based on
  the full window before, now it is based on the viewport itself.
* For user defined viewports, always use Expose instead of
  Letterbox with bars, the latter doesn't make sense then.

Modified Paths:
--------------
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
    trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
    trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.h
    trunk/blender/source/gameengine/Rasterizer/RAS_BucketManager.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_FramingManager.h
    trunk/blender/source/gameengine/Rasterizer/RAS_IRasterizer.h
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2008-09-13 21:06:22 UTC (rev 16509)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2008-09-14 00:32:18 UTC (rev 16510)
@@ -7762,7 +7762,7 @@
 		}
 	}
 
-	if(main->versionfile <= 246 && main->subversionfile < 1){
+	if(main->versionfile < 246 || (main->versionfile == 246 && main->subversionfile < 1)) {
 		Mesh *me;
 
 		for(me=main->mesh.first; me; me= me->id.next)

Modified: trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2008-09-13 21:06:22 UTC (rev 16509)
+++ trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2008-09-14 00:32:18 UTC (rev 16510)
@@ -627,7 +627,7 @@
 		material->transp = TF_ALPHA;
 
   	// always zsort alpha + add
-	if((material->transp == TF_ALPHA || texalpha) && (material->transp != TF_CLIP)) {
+	if((material->transp == TF_ALPHA || material->transp == TF_ADD || texalpha) && (material->transp != TF_CLIP)) {
 		material->ras_mode |= ALPHA;
 		material->ras_mode |= (material->mode & TF_ALPHASORT)? ZSORT: 0;
 	}

Modified: trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp	2008-09-13 21:06:22 UTC (rev 16509)
+++ trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp	2008-09-14 00:32:18 UTC (rev 16510)
@@ -629,7 +629,8 @@
 				char pathname[160];
 
 				get_filename(argc, argv, filename);
-				make_absolute_filename(filename);
+				if(filename[0])
+					make_absolute_filename(filename);
 				
 				do
 				{

Modified: trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp	2008-09-13 21:06:22 UTC (rev 16509)
+++ trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp	2008-09-14 00:32:18 UTC (rev 16510)
@@ -276,30 +276,73 @@
 
 }
 
-bool KX_KetsjiEngine::BeginFrame()
+void KX_KetsjiEngine::ClearFrame()
 {
-	bool result = false;
+	// clear unless we're drawing overlapping stereo
+	if(m_rasterizer->InterlacedStereo() &&
+		m_rasterizer->GetEye() == RAS_IRasterizer::RAS_STEREO_RIGHTEYE)
+		return;
 
-	RAS_Rect vp;
-	KX_Scene* firstscene = *m_scenes.begin();
-	const RAS_FrameSettings &framesettings = firstscene->GetFramingType();
+	// clear the viewports with the background color of the first scene
+	bool doclear = false;
+	KX_SceneList::iterator sceneit;
+	RAS_Rect clearvp, area, viewport;
 
-	// set the area used for rendering
+	for (sceneit = m_scenes.begin(); sceneit != m_scenes.end(); sceneit++)
+	{
+		KX_Scene* scene = *sceneit;
+		//const RAS_FrameSettings &framesettings = scene->GetFramingType();
+		list<class KX_Camera*>* cameras = scene->GetCameras();
+
+		list<KX_Camera*>::iterator it;
+		for(it = cameras->begin(); it != cameras->end(); it++)
+		{
+			SetupViewport(scene, (*it), area, viewport);
+
+			if(!doclear) {
+				clearvp = viewport;
+				doclear = true;
+			}
+			else {
+				if(viewport.GetLeft() < clearvp.GetLeft())
+					clearvp.SetLeft(viewport.GetLeft());
+				if(viewport.GetBottom() < clearvp.GetBottom())
+					clearvp.SetBottom(viewport.GetBottom());
+				if(viewport.GetRight() > clearvp.GetRight())
+					clearvp.SetRight(viewport.GetRight());
+				if(viewport.GetTop() > clearvp.GetTop())
+					clearvp.SetTop(viewport.GetTop());
+
+			}
+		}
+	}
+
+	if(doclear) {
+		KX_Scene* firstscene = *m_scenes.begin();
+		SetBackGround(firstscene->GetWorldInfo());
+
+		m_canvas->SetViewPort(clearvp.GetLeft(), clearvp.GetBottom(),
+			clearvp.GetRight(), clearvp.GetTop());	
+		m_rasterizer->ClearColorBuffer();
+	}
+}
+
+bool KX_KetsjiEngine::BeginFrame()
+{
+	// set the area used for rendering (stereo can assign only a subset)
 	m_rasterizer->SetRenderArea();
 
-	RAS_FramingManager::ComputeViewport(framesettings, m_canvas->GetDisplayArea(), vp);
-
 	if (m_canvas->BeginDraw())
 	{
-		result = true;
+		ClearFrame();
 
-		m_canvas->SetViewPort(vp.GetLeft(), vp.GetBottom(), vp.GetRight(), vp.GetTop());
-		SetBackGround( firstscene->GetWorldInfo() );
-		m_rasterizer->BeginFrame( m_drawingmode , m_kxsystem->GetTimeInSeconds());
-		m_rendertools->BeginFrame( m_rasterizer);
+		m_rasterizer->BeginFrame(m_drawingmode , m_kxsystem->GetTimeInSeconds());
+		m_rendertools->BeginFrame(m_rasterizer);
+
+		return true;
 	}
 	
-	return result;
+	return false;
 }		
 
 
@@ -606,7 +649,7 @@
 				);
 		}
 		// clear the -whole- viewport
-		m_canvas->ClearBuffer(RAS_ICanvas::COLOR_BUFFER);
+		m_canvas->ClearBuffer(RAS_ICanvas::COLOR_BUFFER|RAS_ICanvas::DEPTH_BUFFER);
 	}
 
 	m_rasterizer->SetEye(RAS_IRasterizer::RAS_STEREO_LEFTEYE);
@@ -635,9 +678,6 @@
 	
 			m_rendertools->SetAuxilaryClientInfo(scene);
 	
-			//Initialize scene viewport.
-			SetupRenderFrame(scene, cam);
-	
 			// do the rendering
 			RenderFrame(scene, cam);
 		}
@@ -655,9 +695,6 @@
 		
 				m_rendertools->SetAuxilaryClientInfo(scene);
 		
-				//Initialize scene viewport.
-				SetupRenderFrame(scene, (*it));
-		
 				// do the rendering
 				RenderFrame(scene, (*it));
 			}
@@ -690,10 +727,6 @@
 			//pass the scene, for picking and raycasting (shadows)
 			m_rendertools->SetAuxilaryClientInfo(scene);
 
-			//Initialize scene viewport.
-			//SetupRenderFrame(scene);
-			SetupRenderFrame(scene, cam);
-
 			// do the rendering
 			//RenderFrame(scene);
 			RenderFrame(scene, cam);
@@ -854,7 +887,7 @@
 }
 
 	
-void KX_KetsjiEngine::SetupRenderFrame(KX_Scene *scene, KX_Camera* cam)
+void KX_KetsjiEngine::SetupViewport(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
@@ -862,17 +895,26 @@
 
 	// Note we postpone computation of the projection matrix
 	// so that we are using the latest camera position.
+	if (cam->GetViewport()) {
+		RAS_Rect userviewport;
 
-	RAS_Rect viewport;
+		userviewport.SetLeft(cam->GetViewportLeft()); 
+		userviewport.SetBottom(cam->GetViewportBottom());
+		userviewport.SetRight(cam->GetViewportRight());
+		userviewport.SetTop(cam->GetViewportTop());
 
-	if (!cam)
-		return;
+		// Don't do bars on user specified viewport
+		RAS_FrameSettings settings = scene->GetFramingType();
+		if(settings.FrameType() == RAS_FrameSettings::e_frame_bars)
+			settings.SetFrameType(RAS_FrameSettings::e_frame_extend);
 
-	if (cam->GetViewport()) {
-		viewport.SetLeft(cam->GetViewportLeft()); 
-		viewport.SetBottom(cam->GetViewportBottom());
-		viewport.SetRight(cam->GetViewportRight());
-		viewport.SetTop(cam->GetViewportTop());
+		RAS_FramingManager::ComputeViewport(
+			scene->GetFramingType(),
+			userviewport,
+			viewport
+		);
+
+		area = userviewport;
 	}
 	else if ( m_overrideCam || (scene->GetName() != m_overrideSceneName) ||  m_overrideCamUseOrtho ) {
 		RAS_FramingManager::ComputeViewport(
@@ -880,24 +922,16 @@
 			m_canvas->GetDisplayArea(),
 			viewport
 		);
+
+		area = m_canvas->GetDisplayArea();
 	} else {
 		viewport.SetLeft(0); 
 		viewport.SetBottom(0);
 		viewport.SetRight(int(m_canvas->GetWidth()));
 		viewport.SetTop(int(m_canvas->GetHeight()));
+
+		area = m_canvas->GetDisplayArea();
 	}
-	// store the computed viewport in the scene
-
-	scene->SetSceneViewport(viewport);	
-
-	// set the viewport for this frame and scene
-	m_canvas->SetViewPort(
-		viewport.GetLeft(),
-		viewport.GetBottom(),
-		viewport.GetRight(),
-		viewport.GetTop()
-	);	
-
 }
 
 void KX_KetsjiEngine::RenderShadowBuffers(KX_Scene *scene)
@@ -951,12 +985,22 @@
 // update graphics
 void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam)
 {
+	RAS_Rect viewport, area;
 	float left, right, bottom, top, nearfrust, farfrust, focallength;
 	const float ortho = 100.0;
 //	KX_Camera* cam = scene->GetActiveCamera();
 	
 	if (!cam)
 		return;
+
+	SetupViewport(scene, cam, area, viewport);
+
+	// store the computed viewport in the scene
+	scene->SetSceneViewport(viewport);	
+
+	// set the viewport for this frame and scene
+	m_canvas->SetViewPort(viewport.GetLeft(), viewport.GetBottom(),
+		viewport.GetRight(), viewport.GetTop());	
 	
 	// see KX_BlenderMaterial::Activate
 	//m_rasterizer->SetAmbient();
@@ -985,8 +1029,8 @@
 		
 		RAS_FramingManager::ComputeFrustum(
 			scene->GetFramingType(),
-			m_canvas->GetDisplayArea(),
-			scene->GetSceneViewport(),
+			area,
+			viewport,
 			lens,
 			nearfrust,
 			farfrust,
@@ -1002,7 +1046,7 @@
 
 		MT_Matrix4x4 projmat = m_rasterizer->GetFrustumMatrix(
 			left, right, bottom, top, nearfrust, farfrust, focallength);
-	
+
 		cam->SetProjectionMatrix(projmat);
 		
 		// Otherwise the projection matrix for each eye will be the same...

Modified: trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.h	2008-09-13 21:06:22 UTC (rev 16509)
+++ trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.h	2008-09-14 00:32:18 UTC (rev 16510)
@@ -177,7 +177,7 @@
 	/** Blue component of framing bar color. */
 	float					m_overrideFrameColorB;
 
-	void					SetupRenderFrame(KX_Scene *scene, KX_Camera* cam);
+	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();
@@ -355,6 +355,7 @@
 	KX_Scene*		CreateScene(const STR_String& scenename);
 	
 	bool			BeginFrame();
+	void			ClearFrame();
 	void			EndFrame();
 };
 

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_BucketManager.cpp
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_BucketManager.cpp	2008-09-13 21:06:22 UTC (rev 16509)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_BucketManager.cpp	2008-09-14 00:32:18 UTC (rev 16510)
@@ -130,9 +130,6 @@
 		sort(slots.begin(), slots.end(), fronttoback());
 }
 
-//static int TOTASLOT = 0;
-//static int TOTSLOT = 0;
-
 void RAS_BucketManager::RenderAlphaBuckets(
 	const MT_Transform& cameratrans, RAS_IRasterizer* rasty, RAS_IRenderTools* rendertools)
 {
@@ -149,10 +146,8 @@

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list