[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18840] trunk/blender/source: Fix for bug #18228: OpenGL specular did not get the correct view

Brecht Van Lommel brecht at blender.org
Fri Feb 6 20:21:25 CET 2009


Revision: 18840
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18840
Author:   blendix
Date:     2009-02-06 20:21:24 +0100 (Fri, 06 Feb 2009)

Log Message:
-----------
Fix for bug #18228: OpenGL specular did not get the correct view
vector in perspective mode. This is default OpenGL behavior, but
by now this optimization is really insignificant. Works in both
the 3d view and game engine.

Modified Paths:
--------------
    trunk/blender/source/blender/gpu/GPU_draw.h
    trunk/blender/source/blender/gpu/intern/gpu_draw.c
    trunk/blender/source/blender/include/BSE_view.h
    trunk/blender/source/blender/src/drawmesh.c
    trunk/blender/source/blender/src/view.c
    trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
    trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h
    trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
    trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.h
    trunk/blender/source/gameengine/Rasterizer/RAS_IRasterizer.h
    trunk/blender/source/gameengine/Rasterizer/RAS_IRenderTools.h
    trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp
    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/gpu/GPU_draw.h
===================================================================
--- trunk/blender/source/blender/gpu/GPU_draw.h	2009-02-06 18:38:10 UTC (rev 18839)
+++ trunk/blender/source/blender/gpu/GPU_draw.h	2009-02-06 19:21:24 UTC (rev 18840)
@@ -82,7 +82,7 @@
 
 int GPU_default_lights(void);
 int GPU_scene_object_lights(struct Scene *scene, struct Object *ob,
-	int lay, float viewmat[][4]);
+	int lay, float viewmat[][4], int ortho);
 
 /* Text render
  * - based on moving uv coordinates */

Modified: trunk/blender/source/blender/gpu/intern/gpu_draw.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_draw.c	2009-02-06 18:38:10 UTC (rev 18839)
+++ trunk/blender/source/blender/gpu/intern/gpu_draw.c	2009-02-06 19:21:24 UTC (rev 18840)
@@ -993,6 +993,8 @@
 		U.light[2].spec[3]= 1.0;
 	}
 
+	glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE);
+
 	glLightfv(GL_LIGHT0, GL_POSITION, U.light[0].vec); 
 	glLightfv(GL_LIGHT0, GL_DIFFUSE, U.light[0].col); 
 	glLightfv(GL_LIGHT0, GL_SPECULAR, U.light[0].spec); 
@@ -1030,7 +1032,7 @@
 	return count;
 }
 
-int GPU_scene_object_lights(Scene *scene, Object *ob, int lay, float viewmat[][4])
+int GPU_scene_object_lights(Scene *scene, Object *ob, int lay, float viewmat[][4], int ortho)
 {
 	Base *base;
 	Lamp *la;
@@ -1041,6 +1043,10 @@
 	for(count=0; count<8; count++)
 		glDisable(GL_LIGHT0+count);
 	
+	/* view direction for specular is not compute correct by default in
+	 * opengl, so we set the settings ourselfs */
+	glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, (ortho)? GL_FALSE: GL_TRUE);
+
 	count= 0;
 	
 	for(base=scene->base.first; base; base=base->next) {
@@ -1127,9 +1133,6 @@
 
 	GPU_default_lights();
 	
-	/* no local viewer, looks ugly in ortho mode */
-	/* glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, &one); */
-	
 	glDepthFunc(GL_LEQUAL);
 	/* scaling matrices */
 	glEnable(GL_NORMALIZE);

Modified: trunk/blender/source/blender/include/BSE_view.h
===================================================================
--- trunk/blender/source/blender/include/BSE_view.h	2009-02-06 18:38:10 UTC (rev 18839)
+++ trunk/blender/source/blender/include/BSE_view.h	2009-02-06 19:21:24 UTC (rev 18840)
@@ -82,6 +82,7 @@
 void view_zoom_mouseloc(float dfac, short *mouseloc);
 int view_mouse_depth( float mouse_worldloc[3], short mval[2], int dist);
 
+int get_view3d_ortho(struct View3D *v3d);
 int get_view3d_viewplane(int winxi, int winyi, rctf *viewplane, float *clipsta, float *clipend, float *pixsize);
 void setwinmatrixview3d(int winx, int winy, struct rctf *rect);
 

Modified: trunk/blender/source/blender/src/drawmesh.c
===================================================================
--- trunk/blender/source/blender/src/drawmesh.c	2009-02-06 18:38:10 UTC (rev 18839)
+++ trunk/blender/source/blender/src/drawmesh.c	2009-02-06 19:21:24 UTC (rev 18840)
@@ -75,6 +75,7 @@
 #include "BDR_drawmesh.h"
 
 #include "BSE_drawview.h"
+#include "BSE_view.h"
 
 #include "GPU_extensions.h"
 #include "GPU_draw.h"
@@ -351,9 +352,10 @@
 		solidtex= 1;
 		Gtexdraw.islit= -1;
 	}
-	else
+	else {
 		/* draw with lights in the scene otherwise */
-		Gtexdraw.islit= GPU_scene_object_lights(G.scene, ob, G.vd->lay, G.vd->viewmat);
+		Gtexdraw.islit= GPU_scene_object_lights(G.scene, ob, G.vd->lay, G.vd->viewmat, get_view3d_ortho(G.vd));
+	}
 	
 	obcol[0]= CLAMPIS(ob->col[0]*255, 0, 255);
 	obcol[1]= CLAMPIS(ob->col[1]*255, 0, 255);

Modified: trunk/blender/source/blender/src/view.c
===================================================================
--- trunk/blender/source/blender/src/view.c	2009-02-06 18:38:10 UTC (rev 18839)
+++ trunk/blender/source/blender/src/view.c	2009-02-06 19:21:24 UTC (rev 18840)
@@ -1579,7 +1579,29 @@
 	}
 }
 
+int get_view3d_ortho(View3D *v3d)
+{
+	Camera *cam;
+	
+	if(v3d->persp==V3D_CAMOB) {
+		if(v3d->camera && v3d->camera->type==OB_CAMERA) {
+			cam= v3d->camera->data;
 
+			if(cam && cam->type==CAM_ORTHO)
+				return 1;
+			else
+				return 0;
+		}
+		else
+			return 0;
+	}
+	
+	if(v3d->persp==V3D_ORTHO)
+		return 1;
+
+	return 0;
+}
+
 int get_view3d_viewplane(int winxi, int winyi, rctf *viewplane, float *clipsta, float *clipend, float *pixsize)
 {
 	Camera *cam=NULL;

Modified: trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
===================================================================
--- trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp	2009-02-06 18:38:10 UTC (rev 18839)
+++ trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp	2009-02-06 19:21:24 UTC (rev 18840)
@@ -80,7 +80,7 @@
  * has a maximum of 8 lights (simultaneous), so 20 * 8 lights are possible in
  * a scene. */
 
-void KX_BlenderRenderTools::ProcessLighting(int layer, const MT_Transform& viewmat)
+void KX_BlenderRenderTools::ProcessLighting(RAS_IRasterizer *rasty, int layer, const MT_Transform& viewmat)
 {
 	if(m_lastlightlayer == layer)
 		return;
@@ -101,12 +101,12 @@
 	}
 
 	if(enable)
-		EnableOpenGLLights();
+		EnableOpenGLLights(rasty);
 	else
 		DisableOpenGLLights();
 }
 
-void KX_BlenderRenderTools::EnableOpenGLLights()
+void KX_BlenderRenderTools::EnableOpenGLLights(RAS_IRasterizer *rasty)
 {
 	if(m_lastlighting == true)
 		return;
@@ -115,7 +115,8 @@
 	glEnable(GL_COLOR_MATERIAL);
 
 	glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
-	glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, true);
+	glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
+	glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, (rasty->GetCameraOrtho())? GL_FALSE: GL_TRUE);
 	if (GLEW_EXT_separate_specular_color || GLEW_VERSION_1_2)
 		glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
 	

Modified: trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h
===================================================================
--- trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h	2009-02-06 18:38:10 UTC (rev 18839)
+++ trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h	2009-02-06 19:21:24 UTC (rev 18840)
@@ -60,9 +60,9 @@
 	void				EndFrame(RAS_IRasterizer* rasty);
 	void				BeginFrame(RAS_IRasterizer* rasty);
 
-	void				EnableOpenGLLights();
+	void				EnableOpenGLLights(RAS_IRasterizer *rasty);
 	void				DisableOpenGLLights();
-	void				ProcessLighting(int layer, const MT_Transform& viewmat);
+	void				ProcessLighting(RAS_IRasterizer *rasty, int layer, const MT_Transform& viewmat);
 
 	void			    RenderText2D(RAS_TEXT_RENDER_MODE mode,
 									 const char* text,

Modified: trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp	2009-02-06 18:38:10 UTC (rev 18839)
+++ trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp	2009-02-06 19:21:24 UTC (rev 18840)
@@ -85,7 +85,7 @@
  * has a maximum of 8 lights (simultaneous), so 20 * 8 lights are possible in
  * a scene. */
 
-void GPC_RenderTools::ProcessLighting(int layer, const MT_Transform& viewmat)
+void GPC_RenderTools::ProcessLighting(RAS_IRasterizer *rasty, int layer, const MT_Transform& viewmat)
 {
 	if(m_lastlightlayer == layer)
 		return;
@@ -106,12 +106,12 @@
 	}
 
 	if(enable)
-		EnableOpenGLLights();
+		EnableOpenGLLights(rasty);
 	else
 		DisableOpenGLLights();
 }
 
-void GPC_RenderTools::EnableOpenGLLights()
+void GPC_RenderTools::EnableOpenGLLights(RAS_IRasterizer *rasty)
 {
 	if(m_lastlighting == true)
 		return;
@@ -120,7 +120,8 @@
 	glEnable(GL_COLOR_MATERIAL);
 
 	glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
-	glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, true);
+	glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
+	glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, (rasty->GetCameraOrtho())? GL_FALSE: GL_TRUE);
 	if (GLEW_EXT_separate_specular_color || GLEW_VERSION_1_2)
 		glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
 	

Modified: trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.h
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.h	2009-02-06 18:38:10 UTC (rev 18839)
+++ trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.h	2009-02-06 19:21:24 UTC (rev 18840)
@@ -65,9 +65,9 @@
 	void				EndFrame(RAS_IRasterizer* rasty);
 	void				BeginFrame(RAS_IRasterizer* rasty);
 
-	void				EnableOpenGLLights();
+	void				EnableOpenGLLights(RAS_IRasterizer *rasty);
 	void				DisableOpenGLLights();
-	void				ProcessLighting(int layer, const MT_Transform& viewmat);
+	void				ProcessLighting(RAS_IRasterizer *rasty, int layer, const MT_Transform& viewmat);
 
 	/* @attention mode is ignored here */
 	void			    RenderText2D(RAS_TEXT_RENDER_MODE mode,

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_IRasterizer.h
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_IRasterizer.h	2009-02-06 18:38:10 UTC (rev 18839)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_IRasterizer.h	2009-02-06 19:21:24 UTC (rev 18840)
@@ -255,6 +255,8 @@
 	/**
 	 */
 	virtual const	MT_Point3& GetCameraPosition()=0;
+	virtual bool	GetCameraOrtho()=0;
+
 	/**
 	 */
 	virtual void	SetFog(float start,

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_IRenderTools.h
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_IRenderTools.h	2009-02-06 18:38:10 UTC (rev 18839)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_IRenderTools.h	2009-02-06 19:21:24 UTC (rev 18840)
@@ -134,6 +134,7 @@
 	virtual 
 		void		
 	ProcessLighting(
+		RAS_IRasterizer *rasty,
 		int layer,
 		const MT_Transform& trans
 	)=0;

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp	2009-02-06 18:38:10 UTC (rev 18839)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp	2009-02-06 19:21:24 UTC (rev 18840)
@@ -517,9 +517,9 @@
 		return false;
 	
 	if (m_material->UsesLighting(rasty))
-		rendertools->ProcessLighting(RAS_IRenderTools::RAS_LIGHT_OBJECT_LAYER, cameratrans);
+		rendertools->ProcessLighting(rasty, RAS_IRenderTools::RAS_LIGHT_OBJECT_LAYER, cameratrans);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list