[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