1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* libs/opengles/light.cpp
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Copyright 2006, The Android Open Source Project
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** you may not use this file except in compliance with the License.
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** You may obtain a copy of the License at
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Unless required by applicable law or agreed to in writing, software
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** See the License for the specific language governing permissions and
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** limitations under the License.
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h>
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "context.h"
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "fp.h"
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "light.h"
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "state.h"
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "matrix.h"
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if defined(__arm__) && defined(__thumb__)
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#warning "light.cpp should not be compiled in thumb on ARM."
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void invalidate_lighting(ogles_context_t* c);
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void lightVertexValidate(ogles_context_t* c, vertex_t* v);
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void lightVertexNop(ogles_context_t* c, vertex_t* v);
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void lightVertex(ogles_context_t* c, vertex_t* v);
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void lightVertexMaterial(ogles_context_t* c, vertex_t* v);
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline void vscale3(GLfixed* d, const GLfixed* m, GLfixed s);
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline))
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid vnorm3(GLfixed* d, const GLfixed* a);
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline void vsa3(GLfixed* d,
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GLfixed* m, GLfixed s, const GLfixed* a);
4769ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopianstatic inline void vss3(GLfixed* d,
4869ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian    const GLfixed* m, GLfixed s, const GLfixed* a);
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline void vmla3(GLfixed* d,
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GLfixed* m0, const GLfixed* m1, const GLfixed* a);
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline void vmul3(GLfixed* d,
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GLfixed* m0, const GLfixed* m1);
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLfixed fog_linear(ogles_context_t* c, GLfixed z);
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLfixed fog_exp(ogles_context_t* c, GLfixed z);
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLfixed fog_exp2(ogles_context_t* c, GLfixed z);
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void init_white(vec4_t& c) {
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c.r = c.g = c.b = c.a = 0x10000;
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_init_light(ogles_context_t* c)
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (unsigned int i=0 ; i<OGLES_MAX_LIGHTS ; i++) {
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->lighting.lights[i].ambient.a = 0x10000;
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->lighting.lights[i].position.z = 0x10000;
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->lighting.lights[i].spotDir.z = -0x10000;
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->lighting.lights[i].spotCutoff = gglIntToFixed(180);
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->lighting.lights[i].attenuation[0] = 0x10000;
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    init_white(c->lighting.lights[0].diffuse);
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    init_white(c->lighting.lights[0].specular);
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.front.ambient.r =
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.front.ambient.g =
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.front.ambient.b = gglFloatToFixed(0.2f);
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.front.ambient.a = 0x10000;
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.front.diffuse.r =
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.front.diffuse.g =
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.front.diffuse.b = gglFloatToFixed(0.8f);
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.front.diffuse.a = 0x10000;
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.front.specular.a = 0x10000;
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.front.emission.a = 0x10000;
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.lightModel.ambient.r =
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.lightModel.ambient.g =
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.lightModel.ambient.b = gglFloatToFixed(0.2f);
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.lightModel.ambient.a = 0x10000;
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.colorMaterial.face = GL_FRONT_AND_BACK;
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.colorMaterial.mode = GL_AMBIENT_AND_DIFFUSE;
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->fog.mode = GL_EXP;
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->fog.fog = fog_exp;
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->fog.density = 0x10000;
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->fog.end = 0x10000;
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->fog.invEndMinusStart = 0x10000;
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    invalidate_lighting(c);
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.shadeModel(c, GL_SMOOTH);
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.shadeModel = GL_SMOOTH;
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
10892dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzynvoid ogles_uninit_light(ogles_context_t* /*c*/)
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline int32_t clampF(GLfixed f) CONST;
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint32_t clampF(GLfixed f) {
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    f = (f & ~(f>>31));
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (f >= 0x10000)
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        f = 0x10000;
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return f;
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLfixed fog_linear(ogles_context_t* c, GLfixed z) {
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return clampF(gglMulx((c->fog.end - ((z<0)?-z:z)), c->fog.invEndMinusStart));
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLfixed fog_exp(ogles_context_t* c, GLfixed z) {
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const float e = fixedToFloat(gglMulx(c->fog.density, ((z<0)?-z:z)));
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return clampF(gglFloatToFixed(fastexpf(-e)));
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLfixed fog_exp2(ogles_context_t* c, GLfixed z) {
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const float e = fixedToFloat(gglMulx(c->fog.density, z));
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return clampF(gglFloatToFixed(fastexpf(-e*e)));
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark -
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark math helpers
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid vscale3(GLfixed* d, const GLfixed* m, GLfixed s) {
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    d[0] = gglMulx(m[0], s);
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    d[1] = gglMulx(m[1], s);
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    d[2] = gglMulx(m[2], s);
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid vsa3(GLfixed* d, const GLfixed* m, GLfixed s, const GLfixed* a) {
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    d[0] = gglMulAddx(m[0], s, a[0]);
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    d[1] = gglMulAddx(m[1], s, a[1]);
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    d[2] = gglMulAddx(m[2], s, a[2]);
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline
15569ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopianvoid vss3(GLfixed* d, const GLfixed* m, GLfixed s, const GLfixed* a) {
15669ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian    d[0] = gglMulSubx(m[0], s, a[0]);
15769ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian    d[1] = gglMulSubx(m[1], s, a[1]);
15869ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian    d[2] = gglMulSubx(m[2], s, a[2]);
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid vmla3(GLfixed* d,
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GLfixed* m0, const GLfixed* m1, const GLfixed* a)
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    d[0] = gglMulAddx(m0[0], m1[0], a[0]);
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    d[1] = gglMulAddx(m0[1], m1[1], a[1]);
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    d[2] = gglMulAddx(m0[2], m1[2], a[2]);
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid vmul3(GLfixed* d, const GLfixed* m0, const GLfixed* m1) {
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    d[0] = gglMulx(m0[0], m1[0]);
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    d[1] = gglMulx(m0[1], m1[1]);
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    d[2] = gglMulx(m0[2], m1[2]);
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid vnorm3(GLfixed* d, const GLfixed* a)
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // we must take care of overflows when normalizing a vector
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLfixed n;
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t x = a[0];   x = x>=0 ? x : -x;
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t y = a[1];   y = y>=0 ? y : -y;
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t z = a[2];   z = z>=0 ? z : -z;
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_likely(x<=0x6800 && y<=0x6800 && z<= 0x6800)) {
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // in this case this will all fit on 32 bits
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        n = x*x + y*y + z*z;
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        n = gglSqrtRecipx(n);
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        n <<= 8;
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // here norm^2 is at least 0x7EC00000 (>>32 == 0.495117)
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        n = vsquare3(x, y, z);
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        n = gglSqrtRecipx(n);
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    vscale3(d, a, n);
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark -
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark lighting equations
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline void light_picker(ogles_context_t* c)
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_likely(!c->lighting.enable)) {
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->lighting.lightVertex = lightVertexNop;
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (c->lighting.colorMaterial.enable) {
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->lighting.lightVertex = lightVertexMaterial;
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->lighting.lightVertex = lightVertex;
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline void validate_light_mvi(ogles_context_t* c)
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t en = c->lighting.enabledLights;
219e03eaa1551a644e9a13c327d16cc09bfd7649d78Martin Storsjo    // Vector from object to viewer, in eye coordinates
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while (en) {
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int i = 31 - gglClz(en);
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        en &= ~(1<<i);
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        light_t& l = c->lighting.lights[i];
22404a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian#if OBJECT_SPACE_LIGHTING
22569ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian        c->transforms.mvui.point4(&c->transforms.mvui,
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                &l.objPosition, &l.position);
22704a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian#else
22804a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian        l.objPosition = l.position;
22904a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian#endif
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        vnorm3(l.normalizedObjPosition.v, l.objPosition.v);
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
232c044ae5dfc62031924c2f4c0ecc87b0da72a6b3fDan Stoza    const vec4_t eyeViewer = {{{ 0, 0, 0x10000, 0 }}};
23304a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian#if OBJECT_SPACE_LIGHTING
23404a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian    c->transforms.mvui.point3(&c->transforms.mvui,
23504a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian            &c->lighting.objViewer, &eyeViewer);
23604a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian    vnorm3(c->lighting.objViewer.v, c->lighting.objViewer.v);
23704a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian#else
23804a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian    c->lighting.objViewer = eyeViewer;
23904a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian#endif
240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline void validate_light(ogles_context_t* c)
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // if colorMaterial is enabled, we get the color from the vertex
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!c->lighting.colorMaterial.enable) {
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        material_t& material = c->lighting.front;
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t en = c->lighting.enabledLights;
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        while (en) {
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const int i = 31 - gglClz(en);
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            en &= ~(1<<i);
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            light_t& l = c->lighting.lights[i];
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            vmul3(l.implicitAmbient.v,  material.ambient.v,  l.ambient.v);
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            vmul3(l.implicitDiffuse.v,  material.diffuse.v,  l.diffuse.v);
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            vmul3(l.implicitSpecular.v, material.specular.v, l.specular.v);
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // this is just a flag to tell if we have a specular component
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            l.implicitSpecular.v[3] =
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    l.implicitSpecular.r |
259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    l.implicitSpecular.g |
260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    l.implicitSpecular.b;
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            l.rConstAttenuation = (l.attenuation[1] | l.attenuation[2])==0;
263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (l.rConstAttenuation)
264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                l.rConstAttenuation = gglRecipFast(l.attenuation[0]);
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // emission and ambient for the whole scene
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        vmla3(  c->lighting.implicitSceneEmissionAndAmbient.v,
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                c->lighting.lightModel.ambient.v,
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                material.ambient.v,
270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                material.emission.v);
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->lighting.implicitSceneEmissionAndAmbient.a = material.diffuse.a;
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    validate_light_mvi(c);
274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid invalidate_lighting(ogles_context_t* c)
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: pick lightVertexValidate or lightVertexValidateMVI
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // instead of systematically the heavier lightVertexValidate()
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.lightVertex = lightVertexValidate;
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_invalidate_lighting_mvui(ogles_context_t* c)
284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    invalidate_lighting(c);
286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
28892dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzynvoid lightVertexNop(ogles_context_t*, vertex_t* /*v*/)
289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // we should never end-up here
291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid lightVertexValidateMVI(ogles_context_t* c, vertex_t* v)
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    validate_light_mvi(c);
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    light_picker(c);
297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.lightVertex(c, v);
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid lightVertexValidate(ogles_context_t* c, vertex_t* v)
301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    validate_light(c);
303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    light_picker(c);
304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.lightVertex(c, v);
305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid lightVertexMaterial(ogles_context_t* c, vertex_t* v)
308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // fetch the material color
310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GLvoid* cp = c->arrays.color.element(
311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            v->index & vertex_cache_t::INDEX_MASK);
312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->arrays.color.fetch(c, v->color.v, cp);
313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // acquire the color-material from the vertex
315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    material_t& material = c->lighting.front;
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    material.ambient =
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    material.diffuse = v->color;
318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // implicit arguments need to be computed per/vertex
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t en = c->lighting.enabledLights;
320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while (en) {
321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int i = 31 - gglClz(en);
322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        en &= ~(1<<i);
323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        light_t& l = c->lighting.lights[i];
324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        vmul3(l.implicitAmbient.v,  material.ambient.v,  l.ambient.v);
325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        vmul3(l.implicitDiffuse.v,  material.diffuse.v,  l.diffuse.v);
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        vmul3(l.implicitSpecular.v, material.specular.v, l.specular.v);
32750aba6d31d3ddd0c4dc13292822b7fabade2b6c3Mathias Agopian        // this is just a flag to tell if we have a specular component
32850aba6d31d3ddd0c4dc13292822b7fabade2b6c3Mathias Agopian        l.implicitSpecular.v[3] =
32950aba6d31d3ddd0c4dc13292822b7fabade2b6c3Mathias Agopian                l.implicitSpecular.r |
33050aba6d31d3ddd0c4dc13292822b7fabade2b6c3Mathias Agopian                l.implicitSpecular.g |
33150aba6d31d3ddd0c4dc13292822b7fabade2b6c3Mathias Agopian                l.implicitSpecular.b;
332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // emission and ambient for the whole scene
334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    vmla3(  c->lighting.implicitSceneEmissionAndAmbient.v,
335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->lighting.lightModel.ambient.v,
336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            material.ambient.v,
337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            material.emission.v);
338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.implicitSceneEmissionAndAmbient.a = material.diffuse.a;
339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // now we can light our vertex as usual
341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    lightVertex(c, v);
342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid lightVertex(ogles_context_t* c, vertex_t* v)
345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // emission and ambient for the whole scene
347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    vec4_t r = c->lighting.implicitSceneEmissionAndAmbient;
34804a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian    const vec4_t objViewer = c->lighting.objViewer;
349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t en = c->lighting.enabledLights;
351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_likely(en)) {
352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // since we do the lighting in object-space, we don't need to
353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // transform each normal. However, we might still have to normalize
354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // it if GL_NORMALIZE is enabled.
355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        vec4_t n;
356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->arrays.normal.fetch(c, n.v,
357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->arrays.normal.element(v->index & vertex_cache_t::INDEX_MASK));
35869ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian
35904a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian#if !OBJECT_SPACE_LIGHTING
36004a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian        c->transforms.mvui.point3(&c->transforms.mvui, &n, &n);
36104a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian#endif
36204a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian
36304a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian        // TODO: right now we handle GL_RESCALE_NORMALS as if it were
36469ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian        // GL_NORMALIZE. We could optimize this by  scaling mvui
36569ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian        // appropriately instead.
36669ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian        if (c->transforms.rescaleNormals)
367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            vnorm3(n.v, n.v);
368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const material_t& material = c->lighting.front;
370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int twoSide = c->lighting.lightModel.twoSide;
371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        while (en) {
373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const int i = 31 - gglClz(en);
374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            en &= ~(1<<i);
375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const light_t& l = c->lighting.lights[i];
376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            vec4_t d, t;
378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            GLfixed s;
379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            GLfixed sqDist = 0x10000;
380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // compute vertex-to-light vector
382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (ggl_unlikely(l.position.w)) {
38369ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian                // lightPos/1.0 - vertex/vertex.w == lightPos*vertex.w - vertex
384d5b1cda91ea5826e0fe8fa20d7daad57dc9ffd8bMartin Storsjo#if !OBJECT_SPACE_LIGHTING
385d5b1cda91ea5826e0fe8fa20d7daad57dc9ffd8bMartin Storsjo                vec4_t o;
386d5b1cda91ea5826e0fe8fa20d7daad57dc9ffd8bMartin Storsjo                const transform_t& mv = c->transforms.modelview.transform;
387d5b1cda91ea5826e0fe8fa20d7daad57dc9ffd8bMartin Storsjo                mv.point4(&mv, &o, &v->obj);
388d5b1cda91ea5826e0fe8fa20d7daad57dc9ffd8bMartin Storsjo                vss3(d.v, l.objPosition.v, o.w, o.v);
389d5b1cda91ea5826e0fe8fa20d7daad57dc9ffd8bMartin Storsjo#else
39069ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian                vss3(d.v, l.objPosition.v, v->obj.w, v->obj.v);
391d5b1cda91ea5826e0fe8fa20d7daad57dc9ffd8bMartin Storsjo#endif
392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                sqDist = dot3(d.v, d.v);
393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                vscale3(d.v, d.v, gglSqrtRecipx(sqDist));
394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // TODO: avoid copy here
396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                d = l.normalizedObjPosition;
397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // ambient & diffuse
400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            s = dot3(n.v, d.v);
401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            s = (s<0) ? (twoSide?(-s):0) : s;
402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            vsa3(t.v, l.implicitDiffuse.v, s, l.implicitAmbient.v);
40304a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian
404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // specular
405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (ggl_unlikely(s && l.implicitSpecular.v[3])) {
406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                vec4_t h;
40704a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian                h.x = d.x + objViewer.x;
40804a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian                h.y = d.y + objViewer.y;
40904a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian                h.z = d.z + objViewer.z;
410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                vnorm3(h.v, h.v);
411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                s = dot3(n.v, h.v);
412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                s = (s<0) ? (twoSide?(-s):0) : s;
413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (s > 0) {
414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    s = gglPowx(s, material.shininess);
415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    vsa3(t.v, l.implicitSpecular.v, s, t.v);
416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // spot
420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (ggl_unlikely(l.spotCutoff != gglIntToFixed(180))) {
421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLfixed spotAtt = -dot3(l.normalizedSpotDir.v, d.v);
422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (spotAtt >= l.spotCutoffCosine) {
423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    vscale3(t.v, t.v, gglPowx(spotAtt, l.spotExp));
424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // attenuation
428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (ggl_unlikely(l.position.w)) {
429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (l.rConstAttenuation) {
430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    s = l.rConstAttenuation;
431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    s = gglMulAddx(sqDist, l.attenuation[2], l.attenuation[0]);
433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (l.attenuation[1])
434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        s = gglMulAddx(gglSqrtx(sqDist), l.attenuation[1], s);
435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    s = gglRecipFast(s);
436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                vscale3(t.v, t.v, s);
438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            r.r += t.r;
441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            r.g += t.g;
442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            r.b += t.b;
443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    v->color.r = gglClampx(r.r);
446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    v->color.g = gglClampx(r.g);
447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    v->color.b = gglClampx(r.b);
448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    v->color.a = gglClampx(r.a);
449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    v->flags |= vertex_t::LIT;
450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void lightModelx(GLenum pname, GLfixed param, ogles_context_t* c)
453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(pname != GL_LIGHT_MODEL_TWO_SIDE)) {
455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.lightModel.twoSide = param ? GL_TRUE : GL_FALSE;
459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    invalidate_lighting(c);
460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void lightx(GLenum i, GLenum pname, GLfixed param, ogles_context_t* c)
463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(uint32_t(i-GL_LIGHT0) >= OGLES_MAX_LIGHTS)) {
465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    light_t& light = c->lighting.lights[i-GL_LIGHT0];
470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GLfixed kDegToRad = GLfixed((M_PI * gglIntToFixed(1)) / 180.0f);
471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (pname) {
472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_SPOT_EXPONENT:
473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (GGLfixed(param) >= gglIntToFixed(128)) {
474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ogles_error(c, GL_INVALID_VALUE);
475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        light.spotExp = param;
478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_SPOT_CUTOFF:
480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (param!=gglIntToFixed(180) && GGLfixed(param)>=gglIntToFixed(90)) {
481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ogles_error(c, GL_INVALID_VALUE);
482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        light.spotCutoff = param;
485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        light.spotCutoffCosine =
486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                gglFloatToFixed(cosinef((M_PI/(180.0f*65536.0f))*param));
487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_CONSTANT_ATTENUATION:
489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (param < 0) {
490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ogles_error(c, GL_INVALID_VALUE);
491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        light.attenuation[0] = param;
494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_LINEAR_ATTENUATION:
496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (param < 0) {
497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ogles_error(c, GL_INVALID_VALUE);
498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        light.attenuation[1] = param;
501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_QUADRATIC_ATTENUATION:
503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (param < 0) {
504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ogles_error(c, GL_INVALID_VALUE);
505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        light.attenuation[2] = param;
508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    invalidate_lighting(c);
514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void lightxv(GLenum i, GLenum pname, const GLfixed *params, ogles_context_t* c)
517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(uint32_t(i-GL_LIGHT0) >= OGLES_MAX_LIGHTS)) {
519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLfixed* what;
524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    light_t& light = c->lighting.lights[i-GL_LIGHT0];
525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (pname) {
526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_AMBIENT:
527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        what = light.ambient.v;
528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_DIFFUSE:
530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        what = light.diffuse.v;
531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_SPECULAR:
533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        what = light.specular.v;
534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_POSITION: {
536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_validate_transform(c, transform_state_t::MODELVIEW);
537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        transform_t& mv = c->transforms.modelview.transform;
53804a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian        mv.point4(&mv, &light.position, reinterpret_cast<vec4_t const*>(params));
539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        invalidate_lighting(c);
540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_SPOT_DIRECTION: {
54304a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian#if OBJECT_SPACE_LIGHTING
544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_validate_transform(c, transform_state_t::MVUI);
545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        transform_t& mvui = c->transforms.mvui;
54604a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian        mvui.point3(&mvui, &light.spotDir, reinterpret_cast<vec4_t const*>(params));
54704a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian#else
54804a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian        light.spotDir = *reinterpret_cast<vec4_t const*>(params);
54904a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian#endif
550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        vnorm3(light.normalizedSpotDir.v, light.spotDir.v);
551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        invalidate_lighting(c);
552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        lightx(i, pname, params[0], c);
556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    what[0] = params[0];
559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    what[1] = params[1];
560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    what[2] = params[2];
561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    what[3] = params[3];
562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    invalidate_lighting(c);
563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void materialx(GLenum face, GLenum pname, GLfixed param, ogles_context_t* c)
566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(face != GL_FRONT_AND_BACK)) {
568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(pname != GL_SHININESS)) {
572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.front.shininess = param;
576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    invalidate_lighting(c);
577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void fogx(GLenum pname, GLfixed param, ogles_context_t* c)
580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (pname) {
582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_FOG_DENSITY:
583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (param >= 0) {
584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->fog.density = param;
585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_FOG_START:
590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->fog.start = param;
591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->fog.invEndMinusStart = gglRecip(c->fog.end - c->fog.start);
592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_FOG_END:
594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->fog.end = param;
595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->fog.invEndMinusStart = gglRecip(c->fog.end - c->fog.start);
596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_FOG_MODE:
598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        switch (param) {
599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GL_LINEAR:
600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->fog.mode = param;
601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->fog.fog = fog_linear;
602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GL_EXP:
604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->fog.mode = param;
605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->fog.fog = fog_exp;
606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GL_EXP2:
608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->fog.mode = param;
609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->fog.fog = fog_exp2;
610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ogles_error(c, GL_INVALID_ENUM);
613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0
629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark -
630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark lighting APIs
631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glShadeModel(GLenum mode)
634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(mode != GL_SMOOTH && mode != GL_FLAT)) {
637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.shadeModel = mode;
641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glLightModelf(GLenum pname, GLfloat param)
644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    lightModelx(pname, gglFloatToFixed(param), c);
647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glLightModelx(GLenum pname, GLfixed param)
650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    lightModelx(pname, param, c);
653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glLightModelfv(GLenum pname, const GLfloat *params)
656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pname == GL_LIGHT_MODEL_TWO_SIDE) {
659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        lightModelx(pname, gglFloatToFixed(params[0]), c);
660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(pname != GL_LIGHT_MODEL_AMBIENT)) {
664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.lightModel.ambient.r = gglFloatToFixed(params[0]);
669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.lightModel.ambient.g = gglFloatToFixed(params[1]);
670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.lightModel.ambient.b = gglFloatToFixed(params[2]);
671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.lightModel.ambient.a = gglFloatToFixed(params[3]);
672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    invalidate_lighting(c);
673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glLightModelxv(GLenum pname, const GLfixed *params)
676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pname == GL_LIGHT_MODEL_TWO_SIDE) {
679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        lightModelx(pname, params[0], c);
680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(pname != GL_LIGHT_MODEL_AMBIENT)) {
684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.lightModel.ambient.r = params[0];
689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.lightModel.ambient.g = params[1];
690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.lightModel.ambient.b = params[2];
691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->lighting.lightModel.ambient.a = params[3];
692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    invalidate_lighting(c);
693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0
697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark -
698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glLightf(GLenum i, GLenum pname, GLfloat param)
701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    lightx(i, pname, gglFloatToFixed(param), c);
704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glLightx(GLenum i, GLenum pname, GLfixed param)
707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    lightx(i, pname, param, c);
710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glLightfv(GLenum i, GLenum pname, const GLfloat *params)
713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (pname) {
716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_SPOT_EXPONENT:
717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_SPOT_CUTOFF:
718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_CONSTANT_ATTENUATION:
719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_LINEAR_ATTENUATION:
720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_QUADRATIC_ATTENUATION:
721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        lightx(i, pname, gglFloatToFixed(params[0]), c);
722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLfixed paramsx[4];
726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    paramsx[0] = gglFloatToFixed(params[0]);
727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    paramsx[1] = gglFloatToFixed(params[1]);
728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    paramsx[2] = gglFloatToFixed(params[2]);
729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pname != GL_SPOT_DIRECTION)
730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        paramsx[3] = gglFloatToFixed(params[3]);
731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    lightxv(i, pname, paramsx, c);
733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glLightxv(GLenum i, GLenum pname, const GLfixed *params)
736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    lightxv(i, pname, params, c);
739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0
743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark -
744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glMaterialf(GLenum face, GLenum pname, GLfloat param)
747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    materialx(face, pname, gglFloatToFixed(param), c);
750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glMaterialx(GLenum face, GLenum pname, GLfixed param)
753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    materialx(face, pname, param, c);
756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glMaterialfv(
759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLenum face, GLenum pname, const GLfloat *params)
760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(face != GL_FRONT_AND_BACK)) {
763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLfixed* what=0;
767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLfixed* other=0;
768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (pname) {
769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_AMBIENT:    what = c->lighting.front.ambient.v; break;
770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_DIFFUSE:    what = c->lighting.front.diffuse.v; break;
771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_SPECULAR:   what = c->lighting.front.specular.v; break;
772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_EMISSION:   what = c->lighting.front.emission.v; break;
773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_AMBIENT_AND_DIFFUSE:
77404a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian        what  = c->lighting.front.ambient.v;
77504a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian        other = c->lighting.front.diffuse.v;
776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_SHININESS:
778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->lighting.front.shininess = gglFloatToFixed(params[0]);
779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        invalidate_lighting(c);
780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    what[0] = gglFloatToFixed(params[0]);
786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    what[1] = gglFloatToFixed(params[1]);
787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    what[2] = gglFloatToFixed(params[2]);
788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    what[3] = gglFloatToFixed(params[3]);
789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (other) {
790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        other[0] = what[0];
791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        other[1] = what[1];
792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        other[2] = what[2];
793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        other[3] = what[3];
794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    invalidate_lighting(c);
796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glMaterialxv(
799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLenum face, GLenum pname, const GLfixed *params)
800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(face != GL_FRONT_AND_BACK)) {
803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLfixed* what=0;
807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLfixed* other=0;
808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (pname) {
809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_AMBIENT:    what = c->lighting.front.ambient.v; break;
810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_DIFFUSE:    what = c->lighting.front.diffuse.v; break;
811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_SPECULAR:   what = c->lighting.front.specular.v; break;
812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_EMISSION:   what = c->lighting.front.emission.v; break;
813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_AMBIENT_AND_DIFFUSE:
81404a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian        what  = c->lighting.front.ambient.v;
81504a3f57d19b471c21f3c83c50793a94908cafdc7Mathias Agopian        other = c->lighting.front.diffuse.v;
816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case GL_SHININESS:
818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        c->lighting.front.shininess = gglFloatToFixed(params[0]);
819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        invalidate_lighting(c);
820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    what[0] = params[0];
826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    what[1] = params[1];
827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    what[2] = params[2];
828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    what[3] = params[3];
829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (other) {
830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        other[0] = what[0];
831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        other[1] = what[1];
832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        other[2] = what[2];
833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        other[3] = what[3];
834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    invalidate_lighting(c);
836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0
840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark -
841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark fog
842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glFogf(GLenum pname, GLfloat param) {
845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLfixed paramx = (GLfixed)param;
847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pname != GL_FOG_MODE)
848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        paramx = gglFloatToFixed(param);
849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    fogx(pname, paramx, c);
850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glFogx(GLenum pname, GLfixed param) {
853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    fogx(pname, param, c);
855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glFogfv(GLenum pname, const GLfloat *params)
858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pname != GL_FOG_COLOR) {
861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLfixed paramx = (GLfixed)params[0];
862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (pname != GL_FOG_MODE)
863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            paramx = gglFloatToFixed(params[0]);
864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        fogx(pname, paramx, c);
865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLfixed paramsx[4];
868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    paramsx[0] = gglFloatToFixed(params[0]);
869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    paramsx[1] = gglFloatToFixed(params[1]);
870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    paramsx[2] = gglFloatToFixed(params[2]);
871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    paramsx[3] = gglFloatToFixed(params[3]);
872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.fogColor3xv(c, paramsx);
873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glFogxv(GLenum pname, const GLfixed *params)
876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pname != GL_FOG_COLOR) {
879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        fogx(pname, params[0], c);
880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->rasterizer.procs.fogColor3xv(c, params);
883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
884