[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20756] trunk/blender/source/gameengine: Fix for bug #18900: game engine lights in non-glsl mode did move

Brecht Van Lommel brecht at blender.org
Tue Jun 9 15:51:33 CEST 2009


Revision: 20756
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20756
Author:   blendix
Date:     2009-06-09 15:51:32 +0200 (Tue, 09 Jun 2009)

Log Message:
-----------
Fix for bug #18900: game engine lights in non-glsl mode did move
anymore, missing matrix update. Also move some code to KX_LightObject
to avoid duplication with player.

Modified Paths:
--------------
    trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
    trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Light.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Light.h
    trunk/blender/source/gameengine/Rasterizer/RAS_LightObject.h

Modified: trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
===================================================================
--- trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp	2009-06-09 13:03:00 UTC (rev 20755)
+++ trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp	2009-06-09 13:51:32 UTC (rev 20756)
@@ -28,8 +28,6 @@
 
 #include "GL/glew.h"
 
-#include "DNA_scene_types.h"
-
 #include "RAS_IRenderTools.h"
 #include "RAS_IRasterizer.h"
 #include "RAS_LightObject.h"
@@ -41,6 +39,7 @@
 #include "KX_BlenderMaterial.h"
 #include "KX_RayCast.h"
 #include "KX_IPhysicsController.h"
+#include "KX_Light.h"
 
 #include "PHY_IPhysicsEnvironment.h"
 
@@ -330,21 +329,12 @@
 {
 	// taken from blender source, incompatibility between Blender Object / GameObject	
 	KX_Scene* kxscene = (KX_Scene*)m_auxilaryClientInfo;
-	int scenelayer = ~0;
 	float glviewmat[16];
 	unsigned int count;
-	float vec[4];
+	std::vector<struct	RAS_LightObject*>::iterator lit = m_lights.begin();
 
-	vec[3]= 1.0;
-
-	if(kxscene && kxscene->GetBlenderScene())
-		scenelayer = kxscene->GetBlenderScene()->lay;
-	
 	for(count=0; count<m_numgllights; count++)
 		glDisable((GLenum)(GL_LIGHT0+count));
-	
-	//std::vector<struct	RAS_LightObject*> m_lights;
-	std::vector<struct	RAS_LightObject*>::iterator lit = m_lights.begin();
 
 	viewmat.getValue(glviewmat);
 	
@@ -353,82 +343,14 @@
 	for (lit = m_lights.begin(), count = 0; !(lit==m_lights.end()) && count < m_numgllights; ++lit)
 	{
 		RAS_LightObject* lightdata = (*lit);
-		KX_Scene* lightscene = (KX_Scene*)lightdata->m_scene;
+		KX_LightObject *kxlight = (KX_LightObject*)lightdata->m_light;
 
-		/* only use lights in the same layer as the object */
-		if(!(lightdata->m_layer & objectlayer))
-			continue;
-		/* only use lights in the same scene, and in a visible layer */
-		if(kxscene != lightscene || !(lightdata->m_layer & scenelayer))
-			continue;
-
-		vec[0] = (*(lightdata->m_worldmatrix))(0,3);
-		vec[1] = (*(lightdata->m_worldmatrix))(1,3);
-		vec[2] = (*(lightdata->m_worldmatrix))(2,3);
-		vec[3] = 1;
-
-		if(lightdata->m_type==RAS_LightObject::LIGHT_SUN) {
-			
-			vec[0] = (*(lightdata->m_worldmatrix))(0,2);
-			vec[1] = (*(lightdata->m_worldmatrix))(1,2);
-			vec[2] = (*(lightdata->m_worldmatrix))(2,2);
-			//vec[0]= base->object->obmat[2][0];
-			//vec[1]= base->object->obmat[2][1];
-			//vec[2]= base->object->obmat[2][2];
-			vec[3]= 0.0;
-			glLightfv((GLenum)(GL_LIGHT0+count), GL_POSITION, vec); 
-		}
-		else {
-			//vec[3]= 1.0;
-			glLightfv((GLenum)(GL_LIGHT0+count), GL_POSITION, vec); 
-			glLightf((GLenum)(GL_LIGHT0+count), GL_CONSTANT_ATTENUATION, 1.0);
-			glLightf((GLenum)(GL_LIGHT0+count), GL_LINEAR_ATTENUATION, lightdata->m_att1/lightdata->m_distance);
-			// without this next line it looks backward compatible.
-			//attennuation still is acceptable 
-			glLightf((GLenum)(GL_LIGHT0+count), GL_QUADRATIC_ATTENUATION, lightdata->m_att2/(lightdata->m_distance*lightdata->m_distance)); 
-			
-			if(lightdata->m_type==RAS_LightObject::LIGHT_SPOT) {
-				vec[0] = -(*(lightdata->m_worldmatrix))(0,2);
-				vec[1] = -(*(lightdata->m_worldmatrix))(1,2);
-				vec[2] = -(*(lightdata->m_worldmatrix))(2,2);
-				//vec[0]= -base->object->obmat[2][0];
-				//vec[1]= -base->object->obmat[2][1];
-				//vec[2]= -base->object->obmat[2][2];
-				glLightfv((GLenum)(GL_LIGHT0+count), GL_SPOT_DIRECTION, vec);
-				glLightf((GLenum)(GL_LIGHT0+count), GL_SPOT_CUTOFF, lightdata->m_spotsize/2.0);
-				glLightf((GLenum)(GL_LIGHT0+count), GL_SPOT_EXPONENT, 128.0*lightdata->m_spotblend);
-			}
-			else glLightf((GLenum)(GL_LIGHT0+count), GL_SPOT_CUTOFF, 180.0);
-		}
-		
-		if (lightdata->m_nodiffuse)
-		{
-			vec[0] = vec[1] = vec[2] = vec[3] = 0.0;
-		} else {
-			vec[0]= lightdata->m_energy*lightdata->m_red;
-			vec[1]= lightdata->m_energy*lightdata->m_green;
-			vec[2]= lightdata->m_energy*lightdata->m_blue;
-			vec[3]= 1.0;
-		}
-		glLightfv((GLenum)(GL_LIGHT0+count), GL_DIFFUSE, vec);
-		if (lightdata->m_nospecular)
-		{
-			vec[0] = vec[1] = vec[2] = vec[3] = 0.0;
-		} else if (lightdata->m_nodiffuse) {
-			vec[0]= lightdata->m_energy*lightdata->m_red;
-			vec[1]= lightdata->m_energy*lightdata->m_green;
-			vec[2]= lightdata->m_energy*lightdata->m_blue;
-			vec[3]= 1.0;
-		}
-		glLightfv((GLenum)(GL_LIGHT0+count), GL_SPECULAR, vec);
-		glEnable((GLenum)(GL_LIGHT0+count));
-
-		count++;
+		if(kxlight->ApplyLight(kxscene, objectlayer, count))
+			count++;
 	}
 	glPopMatrix();
 
 	return count;
-
 }
 
 void KX_BlenderRenderTools::MotionBlur(RAS_IRasterizer* rasterizer)

Modified: trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp	2009-06-09 13:03:00 UTC (rev 20755)
+++ trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp	2009-06-09 13:51:32 UTC (rev 20756)
@@ -31,8 +31,6 @@
 
 #include "BMF_Api.h"
 
-#include "DNA_scene_types.h"
-
 #include "RAS_IRenderTools.h"
 #include "RAS_IRasterizer.h"
 #include "RAS_LightObject.h"
@@ -44,6 +42,7 @@
 #include "KX_BlenderMaterial.h"
 #include "KX_RayCast.h"
 #include "KX_IPhysicsController.h"
+#include "KX_Light.h"
 
 #include "PHY_IPhysicsEnvironment.h"
 
@@ -389,21 +388,12 @@
 {
 	// taken from blender source, incompatibility between Blender Object / GameObject	
 	KX_Scene* kxscene = (KX_Scene*)m_auxilaryClientInfo;
-	int scenelayer = ~0;
 	float glviewmat[16];
 	unsigned int count;
-	float vec[4];
+	std::vector<struct	RAS_LightObject*>::iterator lit = m_lights.begin();
 
-	vec[3]= 1.0;
-
-	if(kxscene && kxscene->GetBlenderScene())
-		scenelayer = kxscene->GetBlenderScene()->lay;
-	
 	for(count=0; count<m_numgllights; count++)
 		glDisable((GLenum)(GL_LIGHT0+count));
-	
-	//std::vector<struct	RAS_LightObject*> m_lights;
-	std::vector<struct	RAS_LightObject*>::iterator lit = m_lights.begin();
 
 	viewmat.getValue(glviewmat);
 	
@@ -412,82 +402,14 @@
 	for (lit = m_lights.begin(), count = 0; !(lit==m_lights.end()) && count < m_numgllights; ++lit)
 	{
 		RAS_LightObject* lightdata = (*lit);
-		KX_Scene* lightscene = (KX_Scene*)lightdata->m_scene;
+		KX_LightObject *kxlight = (KX_LightObject*)lightdata->m_light;
 
-		/* only use lights in the same layer as the object */
-		if(!(lightdata->m_layer & objectlayer))
-			continue;
-		/* only use lights in the same scene, and in a visible layer */
-		if(kxscene != lightscene || !(lightdata->m_layer & scenelayer))
-			continue;
-
-		vec[0] = (*(lightdata->m_worldmatrix))(0,3);
-		vec[1] = (*(lightdata->m_worldmatrix))(1,3);
-		vec[2] = (*(lightdata->m_worldmatrix))(2,3);
-		vec[3] = 1;
-
-		if(lightdata->m_type==RAS_LightObject::LIGHT_SUN) {
-			
-			vec[0] = (*(lightdata->m_worldmatrix))(0,2);
-			vec[1] = (*(lightdata->m_worldmatrix))(1,2);
-			vec[2] = (*(lightdata->m_worldmatrix))(2,2);
-			//vec[0]= base->object->obmat[2][0];
-			//vec[1]= base->object->obmat[2][1];
-			//vec[2]= base->object->obmat[2][2];
-			vec[3]= 0.0;
-			glLightfv((GLenum)(GL_LIGHT0+count), GL_POSITION, vec); 
-		}
-		else {
-			//vec[3]= 1.0;
-			glLightfv((GLenum)(GL_LIGHT0+count), GL_POSITION, vec); 
-			glLightf((GLenum)(GL_LIGHT0+count), GL_CONSTANT_ATTENUATION, 1.0);
-			glLightf((GLenum)(GL_LIGHT0+count), GL_LINEAR_ATTENUATION, lightdata->m_att1/lightdata->m_distance);
-			// without this next line it looks backward compatible.
-			//attennuation still is acceptable 
-			glLightf((GLenum)(GL_LIGHT0+count), GL_QUADRATIC_ATTENUATION, lightdata->m_att2/(lightdata->m_distance*lightdata->m_distance)); 
-			
-			if(lightdata->m_type==RAS_LightObject::LIGHT_SPOT) {
-				vec[0] = -(*(lightdata->m_worldmatrix))(0,2);
-				vec[1] = -(*(lightdata->m_worldmatrix))(1,2);
-				vec[2] = -(*(lightdata->m_worldmatrix))(2,2);
-				//vec[0]= -base->object->obmat[2][0];
-				//vec[1]= -base->object->obmat[2][1];
-				//vec[2]= -base->object->obmat[2][2];
-				glLightfv((GLenum)(GL_LIGHT0+count), GL_SPOT_DIRECTION, vec);
-				glLightf((GLenum)(GL_LIGHT0+count), GL_SPOT_CUTOFF, lightdata->m_spotsize/2.0);
-				glLightf((GLenum)(GL_LIGHT0+count), GL_SPOT_EXPONENT, 128.0*lightdata->m_spotblend);
-			}
-			else glLightf((GLenum)(GL_LIGHT0+count), GL_SPOT_CUTOFF, 180.0);
-		}
-		
-		if (lightdata->m_nodiffuse)
-		{
-			vec[0] = vec[1] = vec[2] = vec[3] = 0.0;
-		} else {
-			vec[0]= lightdata->m_energy*lightdata->m_red;
-			vec[1]= lightdata->m_energy*lightdata->m_green;
-			vec[2]= lightdata->m_energy*lightdata->m_blue;
-			vec[3]= 1.0;
-		}
-		glLightfv((GLenum)(GL_LIGHT0+count), GL_DIFFUSE, vec);
-		if (lightdata->m_nospecular)
-		{
-			vec[0] = vec[1] = vec[2] = vec[3] = 0.0;
-		} else if (lightdata->m_nodiffuse) {
-			vec[0]= lightdata->m_energy*lightdata->m_red;
-			vec[1]= lightdata->m_energy*lightdata->m_green;
-			vec[2]= lightdata->m_energy*lightdata->m_blue;
-			vec[3]= 1.0;
-		}
-		glLightfv((GLenum)(GL_LIGHT0+count), GL_SPECULAR, vec);
-		glEnable((GLenum)(GL_LIGHT0+count));
-
-		count++;
+		if(kxlight->ApplyLight(kxscene, objectlayer, count))
+			count++;
 	}
 	glPopMatrix();
 
 	return count;
-
 }
 
 void GPC_RenderTools::MotionBlur(RAS_IRasterizer* rasterizer)

Modified: trunk/blender/source/gameengine/Ketsji/KX_Light.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Light.cpp	2009-06-09 13:03:00 UTC (rev 20755)
+++ trunk/blender/source/gameengine/Ketsji/KX_Light.cpp	2009-06-09 13:51:32 UTC (rev 20756)
@@ -35,6 +35,8 @@
 #pragma warning (disable : 4786)
 #endif
 
+#include "GL/glew.h"
+
 #include "KX_Light.h"
 #include "KX_Camera.h"
 #include "RAS_IRasterizer.h"
@@ -43,6 +45,7 @@
 #include "KX_PyMath.h"
 
 #include "DNA_object_types.h"
+#include "DNA_scene_types.h"
 #include "GPU_material.h"
  
 KX_LightObject::KX_LightObject(void* sgReplicationInfo,SG_Callbacks callbacks,
@@ -56,8 +59,8 @@
 		m_rendertools(rendertools)
 {
 	m_lightobj = lightobj;
-	m_lightobj.m_worldmatrix = GetOpenGLMatrixPtr();
 	m_lightobj.m_scene = sgReplicationInfo;
+	m_lightobj.m_light = this;
 	m_rendertools->AddLight(&m_lightobj);
 	m_glsl = glsl;
 	m_blenderscene = ((KX_Scene*)sgReplicationInfo)->GetBlenderScene();
@@ -84,12 +87,102 @@
 
 	replica->ProcessReplica();
 	
-	replica->m_lightobj.m_worldmatrix = replica->GetOpenGLMatrixPtr();
+	replica->m_lightobj.m_light = replica;
 	m_rendertools->AddLight(&replica->m_lightobj);
 
 	return replica;
 }
 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list