summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Storsjo <martin@martin.st>2009-08-11 18:01:14 +0200
committerMathias Agopian <mathias@google.com>2009-08-25 18:35:54 -0700
commitc0dea964913268bd64009e657635e617f3e0c21c (patch)
tree379fdde7e66d3b8ab88348e0b7138f1ab6ed5970
parent4f31af9346b818c8ef05a63e15e9170a7c6131e4 (diff)
downloadframeworks_base-c0dea964913268bd64009e657635e617f3e0c21c.zip
frameworks_base-c0dea964913268bd64009e657635e617f3e0c21c.tar.gz
frameworks_base-c0dea964913268bd64009e657635e617f3e0c21c.tar.bz2
Calculate specular lighting correctly
Since the lighting calculations are done in object space, the vector from the object to the viewer also needs to be transformed to object space.
-rw-r--r--include/private/opengles/gl_context.h1
-rw-r--r--opengl/libagl/light.cpp11
2 files changed, 9 insertions, 3 deletions
diff --git a/include/private/opengles/gl_context.h b/include/private/opengles/gl_context.h
index 523aed0..67c2dd8 100644
--- a/include/private/opengles/gl_context.h
+++ b/include/private/opengles/gl_context.h
@@ -287,6 +287,7 @@ struct light_t {
vec4_t normalizedObjPosition;
vec4_t spotDir;
vec4_t normalizedSpotDir;
+ vec4_t objViewer;
GLfixed spotExp;
GLfixed spotCutoff;
GLfixed spotCutoffCosine;
diff --git a/opengl/libagl/light.cpp b/opengl/libagl/light.cpp
index 8ae32cc0f..f211bca 100644
--- a/opengl/libagl/light.cpp
+++ b/opengl/libagl/light.cpp
@@ -216,6 +216,8 @@ static inline void light_picker(ogles_context_t* c)
static inline void validate_light_mvi(ogles_context_t* c)
{
uint32_t en = c->lighting.enabledLights;
+ // Vector from object to viewer, in eye coordinates
+ const vec4_t eyeViewer = { 0, 0, 0x1000, 0 };
while (en) {
const int i = 31 - gglClz(en);
en &= ~(1<<i);
@@ -223,6 +225,9 @@ static inline void validate_light_mvi(ogles_context_t* c)
c->transforms.mvui.point4(&c->transforms.mvui,
&l.objPosition, &l.position);
vnorm3(l.normalizedObjPosition.v, l.objPosition.v);
+ c->transforms.mvui.point4(&c->transforms.mvui,
+ &l.objViewer, &eyeViewer);
+ vnorm3(l.objViewer.v, l.objViewer.v);
}
}
@@ -379,9 +384,9 @@ void lightVertex(ogles_context_t* c, vertex_t* v)
// specular
if (ggl_unlikely(s && l.implicitSpecular.v[3])) {
vec4_t h;
- h.x = d.x;
- h.y = d.y;
- h.z = d.z + 0x10000;
+ h.x = d.x + l.objViewer.x;
+ h.y = d.y + l.objViewer.y;
+ h.z = d.z + l.objViewer.z;
vnorm3(h.v, h.v);
s = dot3(n.v, h.v);
s = (s<0) ? (twoSide?(-s):0) : s;