[Bf-committers] Game Engine patch

Sebastian De La Torre rainfellow at sbcglobal.net
Wed May 4 19:39:48 CEST 2005


Thank you for the responses!

I have fixed this and attached the new patch.

The problem was due to the active camera always being
used to calculate the visible meshes instead of the
individual cameras.

--- Carsten Wartmann <Carsten.Wartmann at imago-viva.de>
wrote:
> > However, the clipping seems to be strange. Near
> Objects in my Testscene 
> > are not drawn for some reason.
> 
> Well I tried to render view to the back (rearview
> "mirror"). Seems that 
> the clipping is wrong because of this...
> 
> Maybe I can correct this with the
> ProjectionMatrix....
> 
> Regards,
> Carsten
> _______________________________________________
> Bf-committers mailing list
> Bf-committers at projects.blender.org
>
http://projects.blender.org/mailman/listinfo/bf-committers
> 
-------------- next part --------------
? patch.txt
? user-def.mk
? dlltool/python23.dll.def
? obj/windows
Index: source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp,v
retrieving revision 1.15
diff -u -r1.15 KX_BlenderRenderTools.cpp
--- source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp	25 Mar 2005 10:33:35 -0000	1.15
+++ source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp	4 May 2005 17:11:27 -0000
@@ -288,8 +288,8 @@
 	glEnable(GL_LIGHTING);
 	
 	glEnable(GL_COLOR_MATERIAL);
-	glColorMaterial(GL_FRONT_AND_BACK,GL_DIFFUSE);
-	glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, false);
+	glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
+	glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, true);
 	if (bgl::QueryExtension(bgl::_GL_EXT_separate_specular_color) || bgl::QueryVersion(1, 2))
 		glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
 
Index: source/gameengine/Converter/BlenderWorldInfo.cpp
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/gameengine/Converter/BlenderWorldInfo.cpp,v
retrieving revision 1.5
diff -u -r1.5 BlenderWorldInfo.cpp
--- source/gameengine/Converter/BlenderWorldInfo.cpp	22 Mar 2004 22:01:25 -0000	1.5
+++ source/gameengine/Converter/BlenderWorldInfo.cpp	4 May 2005 17:11:28 -0000
@@ -95,6 +95,10 @@
 		m_backgroundred = blenderworld->horr;
 		m_backgroundgreen = blenderworld->horg;
 		m_backgroundblue = blenderworld->horb;
+		
+		m_ambientred = blenderworld->ambr;
+		m_ambientgreen = blenderworld->ambg;
+		m_ambientblue = blenderworld->ambb;
 	}
 	else
 	{
@@ -134,14 +138,35 @@
 float BlenderWorldInfo::getBackColorGreen()
 {
 	return m_backgroundgreen;
-}  
+}
 
 
 
 float BlenderWorldInfo::getBackColorBlue()
 {
 	return m_backgroundblue;
-}  
+}
+
+
+
+float BlenderWorldInfo::getAmbientColorRed()
+{
+	return m_ambientred;
+}
+
+
+
+float BlenderWorldInfo::getAmbientColorGreen()
+{
+	return m_ambientgreen;
+}
+
+
+
+float BlenderWorldInfo::getAmbientColorBlue()
+{
+	return m_ambientblue;
+}
 
 
 
Index: source/gameengine/Converter/BlenderWorldInfo.h
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/gameengine/Converter/BlenderWorldInfo.h,v
retrieving revision 1.6
diff -u -r1.6 BlenderWorldInfo.h
--- source/gameengine/Converter/BlenderWorldInfo.h	22 Mar 2004 22:01:25 -0000	1.6
+++ source/gameengine/Converter/BlenderWorldInfo.h	4 May 2005 17:11:28 -0000
@@ -41,6 +41,10 @@
 	float			m_backgroundred;
 	float			m_backgroundgreen;
 	float			m_backgroundblue;
+	
+	float			m_ambientred;
+	float			m_ambientgreen;
+	float			m_ambientblue;
 
 	bool			m_hasmist;
 	float			m_miststart;
@@ -58,6 +62,10 @@
     float	getBackColorRed();
     float	getBackColorGreen();
     float	getBackColorBlue();
+    
+    float	getAmbientColorRed();
+    float	getAmbientColorGreen();
+    float	getAmbientColorBlue();
 
     float	getMistStart();
     float	getMistDistance();
Index: source/gameengine/Ketsji/KX_Camera.cpp
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/gameengine/Ketsji/KX_Camera.cpp,v
retrieving revision 1.15
diff -u -r1.15 KX_Camera.cpp
--- source/gameengine/Ketsji/KX_Camera.cpp	22 Jul 2004 00:26:34 -0000	1.15
+++ source/gameengine/Ketsji/KX_Camera.cpp	4 May 2005 17:11:29 -0000
@@ -339,6 +339,44 @@
 	return m_frustum_culling;
 }
 
+void KX_Camera::EnableViewport(bool viewport)
+{
+	m_camdata.m_viewport = viewport;
+}
+
+void KX_Camera::SetViewport(int left, int bottom, int right, int top)
+{
+	m_camdata.m_viewportleft = left;
+	m_camdata.m_viewportbottom = bottom;
+	m_camdata.m_viewportright = right;
+	m_camdata.m_viewporttop = top;
+}
+
+bool KX_Camera::GetViewport() const
+{
+	return m_camdata.m_viewport;
+}
+
+int KX_Camera::GetViewportLeft() const
+{
+	return m_camdata.m_viewportleft;
+}
+
+int KX_Camera::GetViewportBottom() const
+{
+	return m_camdata.m_viewportbottom;
+}
+
+int KX_Camera::GetViewportRight() const
+{
+	return m_camdata.m_viewportright;
+}
+
+int KX_Camera::GetViewportTop() const
+{
+	return m_camdata.m_viewporttop;
+}
+
 //----------------------------------------------------------------------------
 //Python
 
@@ -351,6 +389,8 @@
 	KX_PYMETHODTABLE(KX_Camera, getWorldToCamera),
 	KX_PYMETHODTABLE(KX_Camera, getProjectionMatrix),
 	KX_PYMETHODTABLE(KX_Camera, setProjectionMatrix),
+	KX_PYMETHODTABLE(KX_Camera, enableViewport),
+	KX_PYMETHODTABLE(KX_Camera, setViewport),
 	
 	{NULL,NULL} //Sentinel
 };
@@ -690,4 +730,33 @@
 
 	PyErr_SetString(PyExc_TypeError, "setProjectionMatrix: Expected 4x4 list as matrix argument.");
 	return NULL;
+}
+
+KX_PYMETHODDEF_DOC(KX_Camera, enableViewport,
+"enableViewport(viewport)\n"
+"Sets this camera's viewport status\n"
+)
+{
+	int viewport;
+	if (PyArg_ParseTuple(args,"i",&viewport))
+	{
+		if(viewport)
+			EnableViewport(true);
+		else
+			EnableViewport(false);
+	}
+	Py_Return;
+}
+
+KX_PYMETHODDEF_DOC(KX_Camera, setViewport,
+"setViewport(left, bottom, right, top)\n"
+"Sets this camera's viewport\n"
+)
+{
+	int left, bottom, right, top;
+	if (PyArg_ParseTuple(args,"iiii",&left, &bottom, &right, &top))
+	{
+		SetViewport(left, bottom, right, top);
+	}
+	Py_Return;
 }
Index: source/gameengine/Ketsji/KX_Camera.h
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/gameengine/Ketsji/KX_Camera.h,v
retrieving revision 1.10
diff -u -r1.10 KX_Camera.h
--- source/gameengine/Ketsji/KX_Camera.h	22 Jul 2004 00:26:34 -0000	1.10
+++ source/gameengine/Ketsji/KX_Camera.h	4 May 2005 17:11:29 -0000
@@ -203,6 +203,41 @@
 	 * Gets this camera's culling status.
 	 */
 	bool GetFrustumCulling() const;
+	
+	/**
+	 * Sets this camera's viewport status.
+	 */
+	void EnableViewport(bool viewport);
+	
+	/**
+	 * Sets this camera's viewport.
+	 */
+	void SetViewport(int left, int bottom, int right, int top);
+	
+	/**
+	 * Gets this camera's viewport status.
+	 */
+	bool GetViewport() const;
+	
+	/**
+	 * Gets this camera's viewport left.
+	 */
+	int GetViewportLeft() const;
+	
+	/**
+	 * Gets this camera's viewport bottom.
+	 */
+	int GetViewportBottom() const;
+	
+	/**
+	 * Gets this camera's viewport right.
+	 */
+	int GetViewportRight() const;
+	
+	/**
+	 * Gets this camera's viewport top.
+	 */
+	int GetViewportTop() const;
 
 	KX_PYMETHOD_DOC(KX_Camera, sphereInsideFrustum);
 	KX_PYMETHOD_DOC(KX_Camera, boxInsideFrustum);
@@ -212,6 +247,9 @@
 	KX_PYMETHOD_DOC(KX_Camera, getWorldToCamera);
 	KX_PYMETHOD_DOC(KX_Camera, getProjectionMatrix);
 	KX_PYMETHOD_DOC(KX_Camera, setProjectionMatrix);
+	
+	KX_PYMETHOD_DOC(KX_Camera, enableViewport);
+	KX_PYMETHOD_DOC(KX_Camera, setViewport);
 	
 	virtual PyObject* _getattr(const STR_String& attr); /* lens, near, far, projection_matrix */
 	virtual int       _setattr(const STR_String& attr, PyObject *pyvalue);
Index: source/gameengine/Ketsji/KX_KetsjiEngine.cpp
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp,v
retrieving revision 1.16
diff -u -r1.16 KX_KetsjiEngine.cpp
--- source/gameengine/Ketsji/KX_KetsjiEngine.cpp	25 Mar 2005 10:33:37 -0000	1.16
+++ source/gameengine/Ketsji/KX_KetsjiEngine.cpp	4 May 2005 17:11:31 -0000
@@ -509,20 +509,48 @@
 	// for each scene, call the proceed functions
 	{
 		KX_Scene* scene = *sceneit;
+		KX_Camera* cam = scene->GetActiveCamera();
 
 		// pass the scene's worldsettings to the rasterizer
 		SetWorldSettings(scene->GetWorldInfo());
 		
-		if (scene->IsClearingZBuffer())
-			m_rasterizer->ClearDepthBuffer();
-
-		m_rendertools->SetAuxilaryClientInfo(scene);
-
-		//Initialize scene viewport.
-		SetupRenderFrame(scene);
-
-		// do the rendering
-		RenderFrame(scene);
+		// Avoid drawing the scene with the active camera twice when it's viewport is enabled
+		if(!cam->GetViewport())
+		{
+			if (scene->IsClearingZBuffer())
+				m_rasterizer->ClearDepthBuffer();
+	
+			m_rendertools->SetAuxilaryClientInfo(scene);
+	
+			//Initialize scene viewport.
+			SetupRenderFrame(scene, cam);
+	
+			// do the rendering
+			RenderFrame(scene, cam);
+		}
+		
+		set<class KX_Camera*>* cameras = scene->GetCameras();
+		
+		// Draw the scene once for each camera with an enabled viewport
+		set<KX_Camera*>::iterator it = cameras->begin();
+		while(it != cameras->end())
+		{
+			if((*it)->GetViewport())
+			{
+				if (scene->IsClearingZBuffer())
+					m_rasterizer->ClearDepthBuffer();
+		
+				m_rendertools->SetAuxilaryClientInfo(scene);
+		
+				//Initialize scene viewport.
+				SetupRenderFrame(scene, (*it));
+		
+				// do the rendering
+				RenderFrame(scene, (*it));
+			}
+			
+			it++;
+		}
 	}
 
 	// only one place that checks for stereo
@@ -538,6 +566,7 @@
 		// for each scene, call the proceed functions
 		{
 			KX_Scene* scene = *sceneit;
+			KX_Camera* cam = scene->GetActiveCamera();
 
 			// pass the scene's worldsettings to the rasterizer
 			SetWorldSettings(scene->GetWorldInfo());
@@ -549,10 +578,10 @@
 			m_rendertools->SetAuxilaryClientInfo(scene);
 
 			//Initialize scene viewport.
-			SetupRenderFrame(scene);
+			SetupRenderFrame(scene, cam);
 
 			// do the rendering
-			RenderFrame(scene);
+			RenderFrame(scene, cam);
 		}
 	} // if(m_rasterizer->Stereo())
 
@@ -641,7 +670,12 @@
 	if (wi->hasWorld())
 	{
 		if (m_drawingmode == RAS_IRasterizer::KX_TEXTURED)
-		{	
+		{
+			m_rasterizer->SetAmbientColor(
+				wi->getAmbientColorRed(),
+				wi->getAmbientColorGreen(),
+				wi->getAmbientColorBlue());
+			
 			if (wi->hasMist())
 			{
 				m_rasterizer->SetFog(
@@ -703,7 +737,7 @@
 }
 
 	
-void KX_KetsjiEngine::SetupRenderFrame(KX_Scene *scene)
+void KX_KetsjiEngine::SetupRenderFrame(KX_Scene *scene, KX_Camera* cam)
 {
 	// In this function we make sure the rasterizer settings are upto
 	// date. We compute the viewport so that logic
@@ -713,8 +747,15 @@
 	// so that we are using the latest camera position.
 
 	RAS_Rect viewport;
-
-	if (
+	
+	if(cam->GetViewport())
+	{
+		viewport.SetLeft(cam->GetViewportLeft()); 
+		viewport.SetBottom(cam->GetViewportBottom());
+		viewport.SetRight(cam->GetViewportRight());
+		viewport.SetTop(cam->GetViewportTop());
+	}
+	else if (
 		m_overrideCam || 
 		(scene->GetName() != m_overrideSceneName) || 
 		m_overrideCamUseOrtho
@@ -724,7 +765,8 @@
 			m_canvas->GetDisplayArea(),
 			viewport
 		);
-	} else {
+	}
+	else {
 		viewport.SetLeft(0); 
 		viewport.SetBottom(0);
 		viewport.SetRight(int(m_canvas->GetWidth()));
@@ -746,21 +788,22 @@
 
 	
 // update graphics
-void KX_KetsjiEngine::RenderFrame(KX_Scene* scene)
+void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam)
 {
 	float left, right, bottom, top, nearfrust, farfrust;
 	const float ortho = 100.0;
-	KX_Camera* cam = scene->GetActiveCamera();
 	
 	if (!cam)
 		return;
-
+	
+	m_rasterizer->SetAmbient();
+	
 	m_rasterizer->DisplayFog();
 
 	if (m_overrideCam && (scene->GetName() == m_overrideSceneName) && m_overrideCamUseOrtho) {
 		MT_CmMatrix4x4 projmat = m_overrideCamProjMat;
 		m_rasterizer->SetProjectionMatrix(projmat);
-	} else if (cam->hasValidProjectionMatrix())
+	} else if (cam->hasValidProjectionMatrix() and !cam->GetViewport())
 	{
 		m_rasterizer->SetProjectionMatrix(cam->GetProjectionMatrix());
 	} else
@@ -819,7 +862,7 @@
 	// redrawn. There is a cache between the actual rescheduling
 	// and this call though. Visibility is imparted when this call
 	// runs through the individual objects.
-	scene->CalculateVisibleMeshes(m_rasterizer);
+	scene->CalculateVisibleMeshes(m_rasterizer, cam);
 
 	scene->RenderBuckets(camtrans, m_rasterizer, m_rendertools);
 }
Index: source/gameengine/Ketsji/KX_KetsjiEngine.h
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/gameengine/Ketsji/KX_KetsjiEngine.h,v
retrieving revision 1.9
diff -u -r1.9 KX_KetsjiEngine.h
--- source/gameengine/Ketsji/KX_KetsjiEngine.h	25 Mar 2005 10:33:37 -0000	1.9
+++ source/gameengine/Ketsji/KX_KetsjiEngine.h	4 May 2005 17:11:31 -0000
@@ -166,8 +166,8 @@
 	/** Blue component of framing bar color. */
 	float					m_overrideFrameColorB;
 
-	void					SetupRenderFrame(KX_Scene *scene);
-	void					RenderFrame(KX_Scene* scene);
+	void					SetupRenderFrame(KX_Scene *scene, KX_Camera* cam);
+	void					RenderFrame(KX_Scene* scene, KX_Camera* cam);
 	void					RenderDebugProperties();
 	void					SetBackGround(KX_WorldInfo* worldinfo);
 	void					SetWorldSettings(KX_WorldInfo* worldinfo);
Index: source/gameengine/Ketsji/KX_PythonInit.cpp
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/gameengine/Ketsji/KX_PythonInit.cpp,v
retrieving revision 1.13
diff -u -r1.13 KX_PythonInit.cpp
--- source/gameengine/Ketsji/KX_PythonInit.cpp	25 Mar 2005 10:33:37 -0000	1.13
+++ source/gameengine/Ketsji/KX_PythonInit.cpp	4 May 2005 17:11:32 -0000
@@ -410,6 +410,26 @@
 
 
 
+static PyObject* gPySetAmbientColor(PyObject*, 
+										 PyObject* args, 
+										 PyObject*)
+{
+	
+	MT_Vector3 vec = MT_Vector3(0., 0., 0.);
+	if (PyVecArgTo(args, vec))
+	{
+		if (gp_Rasterizer)
+		{
+			gp_Rasterizer->SetAmbientColor(vec[0], vec[1], vec[2]);
+		}
+		Py_Return;
+	}
+	
+	return NULL;
+}
+
+
+
 static PyObject* gPySetMistColor(PyObject*, 
 										 PyObject* args, 
 										 PyObject*)
@@ -504,6 +524,7 @@
    {"setMousePosition",(PyCFunction) gPySetMousePosition,
    METH_VARARGS, gPySetMousePosition__doc__.Ptr()},
   {"setBackgroundColor",(PyCFunction)gPySetBackgroundColor,METH_VARARGS,"set Background Color (rgb)"},
+  {"setAmbientColor",(PyCFunction)gPySetAmbientColor,METH_VARARGS,"set Ambient Color (rgb)"},
   {"setMistColor",(PyCFunction)gPySetMistColor,METH_VARARGS,"set Mist Color (rgb)"},
   {"setMistStart",(PyCFunction)gPySetMistStart,METH_VARARGS,"set Mist Start(rgb)"},
   {"setMistEnd",(PyCFunction)gPySetMistEnd,METH_VARARGS,"set Mist End(rgb)"},
Index: source/gameengine/Ketsji/KX_Scene.cpp
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/gameengine/Ketsji/KX_Scene.cpp,v
retrieving revision 1.18
diff -u -r1.18 KX_Scene.cpp
--- source/gameengine/Ketsji/KX_Scene.cpp	18 Apr 2005 11:44:21 -0000	1.18
+++ source/gameengine/Ketsji/KX_Scene.cpp	4 May 2005 17:11:34 -0000
@@ -258,6 +258,12 @@
 
 
 
+set<class KX_Camera*>* KX_Scene::GetCameras()
+{
+	return &m_cameras;
+}
+
+
 
 void KX_Scene::SetFramingType(RAS_FrameSettings & frame_settings)
 {
@@ -831,7 +837,7 @@
 	}
 }
 
-void KX_Scene::MarkVisible(SG_Tree *node, RAS_IRasterizer* rasty)
+void KX_Scene::MarkVisible(SG_Tree *node, RAS_IRasterizer* rasty, KX_Camera* cam)
 {
 	int intersect = KX_Camera::INTERSECT;
 	KX_GameObject *gameobj = node->Client()?(KX_GameObject*) node->Client()->GetSGClientObject():NULL;
@@ -843,36 +849,36 @@
 		MT_Scalar radius = node->Radius();
 		MT_Point3 centre = node->Centre();
 		
-		intersect = GetActiveCamera()->SphereInsideFrustum(centre, radius); 
+		intersect = cam->SphereInsideFrustum(centre, radius); 
 		
 		if (intersect == KX_Camera::INTERSECT)
 		{
 			MT_Point3 box[8];
 			node->get(box);
-			intersect = GetActiveCamera()->BoxInsideFrustum(box);
+			intersect = cam->BoxInsideFrustum(box);
 		}
 	}
 
 	switch (intersect)
 	{
 		case KX_Camera::OUTSIDE:
-			MarkSubTreeVisible(node, rasty, false);
+			MarkSubTreeVisible(node, rasty, false, cam);
 			break;
 		case KX_Camera::INTERSECT:
 			if (gameobj)
-				MarkVisible(rasty, gameobj);
+				MarkVisible(rasty, gameobj, cam);
 			if (node->Left())
-				MarkVisible(node->Left(), rasty);
+				MarkVisible(node->Left(), rasty, cam);
 			if (node->Right())
-				MarkVisible(node->Right(), rasty);
+				MarkVisible(node->Right(), rasty, cam);
 			break;
 		case KX_Camera::INSIDE:
-			MarkSubTreeVisible(node, rasty, true);
+			MarkSubTreeVisible(node, rasty, true, cam);
 			break;
 	}
 }
 
-void KX_Scene::MarkSubTreeVisible(SG_Tree *node, RAS_IRasterizer* rasty, bool visible)
+void KX_Scene::MarkSubTreeVisible(SG_Tree *node, RAS_IRasterizer* rasty, bool visible, KX_Camera* cam)
 {
 	if (node->Client())
 	{
@@ -882,7 +888,7 @@
 			if (visible)
 			{
 				int nummeshes = gameobj->GetMeshCount();
-				MT_Transform t( GetActiveCamera()->GetWorldToCamera() * gameobj->GetSGNode()->GetWorldTransform());
+				MT_Transform t( cam->GetWorldToCamera() * gameobj->GetSGNode()->GetWorldTransform());
 	
 				
 				for (int m=0;m<nummeshes;m++)
@@ -895,23 +901,23 @@
 		}
 	}
 	if (node->Left())
-		MarkSubTreeVisible(node->Left(), rasty, visible);
+		MarkSubTreeVisible(node->Left(), rasty, visible, cam);
 	if (node->Right())
-		MarkSubTreeVisible(node->Right(), rasty, visible);
+		MarkSubTreeVisible(node->Right(), rasty, visible, cam);
 }
 
-void KX_Scene::MarkVisible(RAS_IRasterizer* rasty, KX_GameObject* gameobj)
+void KX_Scene::MarkVisible(RAS_IRasterizer* rasty, KX_GameObject* gameobj, KX_Camera* cam)
 {
 	// User (Python/Actuator) has forced object invisible...
 	if (!gameobj->GetVisible())
 		return;
 	// If Frustum culling is off, the object is always visible.
-	bool vis = !GetActiveCamera()->GetFrustumCulling();
+	bool vis = !cam->GetFrustumCulling();
 	
 	// If the camera is inside this node, then the object is visible.
 	if (!vis)
 	{
-		vis = gameobj->GetSGNode()->inside( GetActiveCamera()->GetCameraLocation() );
+		vis = gameobj->GetSGNode()->inside( cam->GetCameraLocation() );
 	}
 		
 	// Test the object's bound sphere against the view frustum.
@@ -919,7 +925,7 @@
 	{
 		MT_Vector3 scale = gameobj->GetSGNode()->GetWorldScaling();
 		MT_Scalar radius = fabs(scale[scale.closestAxis()] * gameobj->GetSGNode()->Radius());
-		switch (GetActiveCamera()->SphereInsideFrustum(gameobj->NodeGetWorldPosition(), radius))
+		switch (cam->SphereInsideFrustum(gameobj->NodeGetWorldPosition(), radius))
 		{
 			case KX_Camera::INSIDE:
 				vis = true;
@@ -931,7 +937,7 @@
 				// Test the object's bound box against the view frustum.
 				MT_Point3 box[8];
 				gameobj->GetSGNode()->getBBox(box); 
-				vis = GetActiveCamera()->BoxInsideFrustum(box) != KX_Camera::OUTSIDE;
+				vis = cam->BoxInsideFrustum(box) != KX_Camera::OUTSIDE;
 				break;
 		}
 	}
@@ -939,7 +945,7 @@
 	if (vis)
 	{
 		int nummeshes = gameobj->GetMeshCount();
-		MT_Transform t(GetActiveCamera()->GetWorldToCamera() * gameobj->GetSGNode()->GetWorldTransform());
+		MT_Transform t(cam->GetWorldToCamera() * gameobj->GetSGNode()->GetWorldTransform());
 		
 		for (int m=0;m<nummeshes;m++)
 		{
@@ -954,20 +960,20 @@
 	}
 }
 
-void KX_Scene::CalculateVisibleMeshes(RAS_IRasterizer* rasty)
+void KX_Scene::CalculateVisibleMeshes(RAS_IRasterizer* rasty, KX_Camera* cam)
 {
 // FIXME: When tree is operational
 #if 1
 	// do this incrementally in the future
 	for (int i = 0; i < m_objectlist->GetCount(); i++)
 	{
-		MarkVisible(rasty, static_cast<KX_GameObject*>(m_objectlist->GetValue(i)));
+		MarkVisible(rasty, static_cast<KX_GameObject*>(m_objectlist->GetValue(i)), cam);
 	}
 #else
-	if (GetActiveCamera()->GetFrustumCulling())
-		MarkVisible(m_objecttree, rasty);
+	if (cam->GetFrustumCulling())
+		MarkVisible(m_objecttree, rasty, cam);
 	else
-		MarkSubTreeVisible(m_objecttree, rasty, true);
+		MarkSubTreeVisible(m_objecttree, rasty, true, cam);
 #endif
 }
 
Index: source/gameengine/Ketsji/KX_Scene.h
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/gameengine/Ketsji/KX_Scene.h,v
retrieving revision 1.13
diff -u -r1.13 KX_Scene.h
--- source/gameengine/Ketsji/KX_Scene.h	25 Mar 2005 10:33:37 -0000	1.13
+++ source/gameengine/Ketsji/KX_Scene.h	4 May 2005 17:11:34 -0000
@@ -248,9 +248,9 @@
 	/**
 	 * Visibility testing functions.
 	 */
-	void MarkVisible(SG_Tree *node, RAS_IRasterizer* rasty);
-	void MarkSubTreeVisible(SG_Tree *node, RAS_IRasterizer* rasty, bool visible);
-	void MarkVisible(RAS_IRasterizer* rasty, KX_GameObject* gameobj);
+	void MarkVisible(SG_Tree *node, RAS_IRasterizer* rasty, KX_Camera* cam);
+	void MarkSubTreeVisible(SG_Tree *node, RAS_IRasterizer* rasty, bool visible, KX_Camera* cam);
+	void MarkVisible(RAS_IRasterizer* rasty, KX_GameObject* gameobj, KX_Camera* cam);
 	
 	/**
 	 * This stores anything from python
@@ -318,6 +318,10 @@
 		SCA_TimeEventManager*	
 	GetTimeEventManager(
 	);
+	
+		set<class KX_Camera*>*
+	GetCameras(
+	);
 
 
 	/** Find a camera in the scene by pointer. */
@@ -447,7 +451,7 @@
 	void SetNetworkScene(NG_NetworkScene *newScene);
 	void SetWorldInfo(class KX_WorldInfo* wi);
 	KX_WorldInfo* GetWorldInfo();
-	void CalculateVisibleMeshes(RAS_IRasterizer* rasty);
+	void CalculateVisibleMeshes(RAS_IRasterizer* rasty, KX_Camera* cam);
 	void UpdateMeshTransformations();
 	KX_Camera* GetpCamera();
 	SND_Scene* GetSoundScene();
Index: source/gameengine/Ketsji/KX_WorldInfo.h
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/gameengine/Ketsji/KX_WorldInfo.h,v
retrieving revision 1.6
diff -u -r1.6 KX_WorldInfo.h
--- source/gameengine/Ketsji/KX_WorldInfo.h	22 Mar 2004 22:01:53 -0000	1.6
+++ source/gameengine/Ketsji/KX_WorldInfo.h	4 May 2005 17:11:34 -0000
@@ -47,6 +47,9 @@
 	virtual float	getBackColorRed()=0;
 	virtual float	getBackColorGreen()=0;
 	virtual float	getBackColorBlue()=0;
+	virtual float	getAmbientColorRed()=0;
+	virtual float	getAmbientColorGreen()=0;
+	virtual float	getAmbientColorBlue()=0;
 	virtual float	getMistStart()=0;
 	virtual float	getMistDistance()=0;
 	virtual float	getMistColorRed()=0;
Index: source/gameengine/Rasterizer/RAS_BucketManager.cpp
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/gameengine/Rasterizer/RAS_BucketManager.cpp,v
retrieving revision 1.8
diff -u -r1.8 RAS_BucketManager.cpp
--- source/gameengine/Rasterizer/RAS_BucketManager.cpp	16 Jan 2005 06:02:05 -0000	1.8
+++ source/gameengine/Rasterizer/RAS_BucketManager.cpp	4 May 2005 17:11:35 -0000
@@ -141,8 +141,16 @@
 	}
 	
 	for (bucket = m_MaterialBuckets.begin(); bucket != m_MaterialBuckets.end(); ++bucket)
+	{
+		if((*bucket)->GetPolyMaterial()->IsZSort())
+			rasty->SetAlphaTest(true);
+		else
+			rasty->SetAlphaTest(false);
+		
 		(*bucket)->Render(cameratrans,rasty,rendertools);
+	}
 	
+	rasty->SetAlphaTest(false);
 	RenderAlphaBuckets(cameratrans, rasty, rendertools);	
 	
 	RAS_MaterialBucket::EndFrame();
Index: source/gameengine/Rasterizer/RAS_CameraData.h
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/gameengine/Rasterizer/RAS_CameraData.h,v
retrieving revision 1.7
diff -u -r1.7 RAS_CameraData.h
--- source/gameengine/Rasterizer/RAS_CameraData.h	11 Apr 2004 02:50:02 -0000	1.7
+++ source/gameengine/Rasterizer/RAS_CameraData.h	4 May 2005 17:11:35 -0000
@@ -38,12 +38,23 @@
 	float m_clipstart;
 	float m_clipend;
 	bool m_perspective;
+	bool m_viewport;
+	int m_viewportleft;
+	int m_viewportbottom;
+	int m_viewportright;
+	int m_viewporttop;
 	
-	RAS_CameraData(float lens = 35., float clipstart = 0.1, float clipend = 100., bool perspective = true) :
+	RAS_CameraData(float lens = 35., float clipstart = 0.1, float clipend = 100., bool perspective = true,
+		bool viewport = false, int viewportleft = 0, int viewportbottom = 0, int viewportright = 0, int viewporttop = 0) :
 		m_lens(lens),
 		m_clipstart(clipstart),
 		m_clipend(clipend),
-		m_perspective(perspective)
+		m_perspective(perspective),
+		m_viewport(viewport),
+		m_viewportleft(viewportleft),
+		m_viewportbottom(viewportbottom),
+		m_viewportright(viewportright),
+		m_viewporttop(viewporttop)
 	{
 	}
 };
Index: source/gameengine/Rasterizer/RAS_IRasterizer.h
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/gameengine/Rasterizer/RAS_IRasterizer.h,v
retrieving revision 1.13
diff -u -r1.13 RAS_IRasterizer.h
--- source/gameengine/Rasterizer/RAS_IRasterizer.h	16 Jan 2005 06:02:05 -0000	1.13
+++ source/gameengine/Rasterizer/RAS_IRasterizer.h	4 May 2005 17:11:35 -0000
@@ -268,6 +268,9 @@
 								 float blue,
 								 float alpha)=0;
 	
+	virtual void	SetAmbientColor(float red, float green, float blue)=0;
+	virtual void	SetAmbient()=0;
+	
 	/**
 	 * @param drawingmode = KX_BOUNDINGBOX, KX_WIREFRAME, KX_SOLID, KX_SHADED or KX_TEXTURED.
 	 */
@@ -281,8 +284,12 @@
 	virtual void	EnableTextures(bool enable)=0;
 	/**
 	 * Sets face culling
-	 */	
+	 */
 	virtual void	SetCullFace(bool enable)=0;
+	/**
+	 * Sets alpha testing
+	 */
+	virtual void	SetAlphaTest(bool enable)=0;
 	/**
 	 * Sets wireframe mode.
 	 */
Index: source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp,v
retrieving revision 1.16
diff -u -r1.16 RAS_OpenGLRasterizer.cpp
--- source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	16 Jan 2005 06:02:06 -0000	1.16
+++ source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	4 May 2005 17:11:36 -0000
@@ -177,6 +177,10 @@
 	m_blueback = 0.4375;
 	m_alphaback = 0.0;
 	
+	m_ambr = 0.0f;
+	m_ambg = 0.0f;
+	m_ambb = 0.0f;
+	
 	glClearColor(m_redback,m_greenback,m_blueback,m_alphaback);
 	glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
 	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
@@ -201,6 +205,23 @@
 
 
 
+void RAS_OpenGLRasterizer::SetAmbientColor(float red, float green, float blue)
+{
+	m_ambr = red;
+	m_ambg = green;
+	m_ambb = blue;
+}
+
+
+
+void RAS_OpenGLRasterizer::SetAmbient()
+{
+	float ambient[] = { m_ambr, m_ambg, m_ambb, 1.0f };
+	glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
+}
+
+
+
 void RAS_OpenGLRasterizer::SetFogColor(float r,
 									   float g,
 									   float b)
@@ -1293,6 +1314,20 @@
 	else
 		glDisable(GL_CULL_FACE);
 }
+
+
+
+void RAS_OpenGLRasterizer::SetAlphaTest(bool enable)
+{
+	if (enable)
+	{
+		glEnable(GL_ALPHA_TEST);
+		glAlphaFunc(GL_GREATER, 0.6f);
+	}
+	else glDisable(GL_ALPHA_TEST);
+}
+
+
 
 void RAS_OpenGLRasterizer::SetLines(bool enable)
 {
Index: source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h,v
retrieving revision 1.12
diff -u -r1.12 RAS_OpenGLRasterizer.h
--- source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h	16 Jan 2005 06:02:06 -0000	1.12
+++ source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h	4 May 2005 17:11:37 -0000
@@ -64,6 +64,10 @@
 	float			m_greenback;
 	float			m_blueback;
 	float			m_alphaback;
+	
+	float			m_ambr;
+	float			m_ambg;
+	float			m_ambb;
 
 	double			m_time;
 	MT_CmMatrix4x4	m_viewmatrix;
@@ -193,11 +197,15 @@
 						float alpha
 					);
 	
+	virtual void	SetAmbientColor(float red, float green, float blue);
+	virtual void	SetAmbient();
+	
 	virtual void	SetDrawingMode(int drawingmode);
 	virtual int		GetDrawingMode();
 
 	virtual void	EnableTextures(bool enable);
 	virtual void	SetCullFace(bool enable);
+	virtual void	SetAlphaTest(bool enable);
 	virtual void	SetLines(bool enable);
 
 	virtual MT_Matrix4x4 GetFrustumMatrix(


More information about the Bf-committers mailing list