19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* libs/opengles/light.cpp
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2006, The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** you may not use this file except in compliance with the License.
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Unless required by applicable law or agreed to in writing, software
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** See the License for the specific language governing permissions and
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License.
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h>
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "context.h"
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "fp.h"
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "light.h"
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "state.h"
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "matrix.h"
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if defined(__arm__) && defined(__thumb__)
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#warning "light.cpp should not be compiled in thumb on ARM."
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void invalidate_lighting(ogles_context_t* c);
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void lightVertexValidate(ogles_context_t* c, vertex_t* v);
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void lightVertexNop(ogles_context_t* c, vertex_t* v);
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void lightVertex(ogles_context_t* c, vertex_t* v);
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void lightVertexMaterial(ogles_context_t* c, vertex_t* v);
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic inline void vscale3(GLfixed* d, const GLfixed* m, GLfixed s);
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic __attribute__((noinline))
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid vnorm3(GLfixed* d, const GLfixed* a);
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic inline void vsa3(GLfixed* d,
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const GLfixed* m, GLfixed s, const GLfixed* a);
47cede1ed3e1721dc4a697a540388ef0f4b51c60ebMathias Agopianstatic inline void vss3(GLfixed* d,
48cede1ed3e1721dc4a697a540388ef0f4b51c60ebMathias Agopian    const GLfixed* m, GLfixed s, const GLfixed* a);
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic inline void vmla3(GLfixed* d,
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const GLfixed* m0, const GLfixed* m1, const GLfixed* a);
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic inline void vmul3(GLfixed* d,
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const GLfixed* m0, const GLfixed* m1);
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic GLfixed fog_linear(ogles_context_t* c, GLfixed z);
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic GLfixed fog_exp(ogles_context_t* c, GLfixed z);
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic GLfixed fog_exp2(ogles_context_t* c, GLfixed z);
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void init_white(vec4_t& c) {
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c.r = c.g = c.b = c.a = 0x10000;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid ogles_init_light(ogles_context_t* c)
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (unsigned int i=0 ; i<OGLES_MAX_LIGHTS ; i++) {
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->lighting.lights[i].ambient.a = 0x10000;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->lighting.lights[i].position.z = 0x10000;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->lighting.lights[i].spotDir.z = -0x10000;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->lighting.lights[i].spotCutoff = gglIntToFixed(180);
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->lighting.lights[i].attenuation[0] = 0x10000;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    init_white(c->lighting.lights[0].diffuse);
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    init_white(c->lighting.lights[0].specular);
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.front.ambient.r =
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.front.ambient.g =
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.front.ambient.b = gglFloatToFixed(0.2f);
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.front.ambient.a = 0x10000;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.front.diffuse.r =
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.front.diffuse.g =
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.front.diffuse.b = gglFloatToFixed(0.8f);
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.front.diffuse.a = 0x10000;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.front.specular.a = 0x10000;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.front.emission.a = 0x10000;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.lightModel.ambient.r =
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.lightModel.ambient.g =
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.lightModel.ambient.b = gglFloatToFixed(0.2f);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.lightModel.ambient.a = 0x10000;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.colorMaterial.face = GL_FRONT_AND_BACK;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.colorMaterial.mode = GL_AMBIENT_AND_DIFFUSE;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->fog.mode = GL_EXP;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->fog.fog = fog_exp;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->fog.density = 0x10000;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->fog.end = 0x10000;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->fog.invEndMinusStart = 0x10000;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    invalidate_lighting(c);
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->rasterizer.procs.shadeModel(c, GL_SMOOTH);
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.shadeModel = GL_SMOOTH;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid ogles_uninit_light(ogles_context_t* c)
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic inline int32_t clampF(GLfixed f) CONST;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint32_t clampF(GLfixed f) {
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    f = (f & ~(f>>31));
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (f >= 0x10000)
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        f = 0x10000;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return f;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic GLfixed fog_linear(ogles_context_t* c, GLfixed z) {
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return clampF(gglMulx((c->fog.end - ((z<0)?-z:z)), c->fog.invEndMinusStart));
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic GLfixed fog_exp(ogles_context_t* c, GLfixed z) {
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const float e = fixedToFloat(gglMulx(c->fog.density, ((z<0)?-z:z)));
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return clampF(gglFloatToFixed(fastexpf(-e)));
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic GLfixed fog_exp2(ogles_context_t* c, GLfixed z) {
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const float e = fixedToFloat(gglMulx(c->fog.density, z));
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return clampF(gglFloatToFixed(fastexpf(-e*e)));
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark -
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark math helpers
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic inline
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid vscale3(GLfixed* d, const GLfixed* m, GLfixed s) {
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    d[0] = gglMulx(m[0], s);
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    d[1] = gglMulx(m[1], s);
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    d[2] = gglMulx(m[2], s);
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic inline
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid vsa3(GLfixed* d, const GLfixed* m, GLfixed s, const GLfixed* a) {
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    d[0] = gglMulAddx(m[0], s, a[0]);
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    d[1] = gglMulAddx(m[1], s, a[1]);
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    d[2] = gglMulAddx(m[2], s, a[2]);
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic inline
155cede1ed3e1721dc4a697a540388ef0f4b51c60ebMathias Agopianvoid vss3(GLfixed* d, const GLfixed* m, GLfixed s, const GLfixed* a) {
156cede1ed3e1721dc4a697a540388ef0f4b51c60ebMathias Agopian    d[0] = gglMulSubx(m[0], s, a[0]);
157cede1ed3e1721dc4a697a540388ef0f4b51c60ebMathias Agopian    d[1] = gglMulSubx(m[1], s, a[1]);
158cede1ed3e1721dc4a697a540388ef0f4b51c60ebMathias Agopian    d[2] = gglMulSubx(m[2], s, a[2]);
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic inline
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid vmla3(GLfixed* d,
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const GLfixed* m0, const GLfixed* m1, const GLfixed* a)
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    d[0] = gglMulAddx(m0[0], m1[0], a[0]);
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    d[1] = gglMulAddx(m0[1], m1[1], a[1]);
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    d[2] = gglMulAddx(m0[2], m1[2], a[2]);
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic inline
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid vmul3(GLfixed* d, const GLfixed* m0, const GLfixed* m1) {
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    d[0] = gglMulx(m0[0], m1[0]);
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    d[1] = gglMulx(m0[1], m1[1]);
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    d[2] = gglMulx(m0[2], m1[2]);
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid vnorm3(GLfixed* d, const GLfixed* a)
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // we must take care of overflows when normalizing a vector
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfixed n;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t x = a[0];   x = x>=0 ? x : -x;
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t y = a[1];   y = y>=0 ? y : -y;
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t z = a[2];   z = z>=0 ? z : -z;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ggl_likely(x<=0x6800 && y<=0x6800 && z<= 0x6800)) {
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // in this case this will all fit on 32 bits
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        n = x*x + y*y + z*z;
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        n = gglSqrtRecipx(n);
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        n <<= 8;
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // here norm^2 is at least 0x7EC00000 (>>32 == 0.495117)
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        n = vsquare3(x, y, z);
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        n = gglSqrtRecipx(n);
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vscale3(d, a, n);
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark -
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark lighting equations
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic inline void light_picker(ogles_context_t* c)
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ggl_likely(!c->lighting.enable)) {
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->lighting.lightVertex = lightVertexNop;
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (c->lighting.colorMaterial.enable) {
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->lighting.lightVertex = lightVertexMaterial;
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->lighting.lightVertex = lightVertex;
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic inline void validate_light_mvi(ogles_context_t* c)
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t en = c->lighting.enabledLights;
219c0dea964913268bd64009e657635e617f3e0c21cMartin Storsjo    // Vector from object to viewer, in eye coordinates
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (en) {
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const int i = 31 - gglClz(en);
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        en &= ~(1<<i);
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        light_t& l = c->lighting.lights[i];
224e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian#if OBJECT_SPACE_LIGHTING
225cede1ed3e1721dc4a697a540388ef0f4b51c60ebMathias Agopian        c->transforms.mvui.point4(&c->transforms.mvui,
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                &l.objPosition, &l.position);
227e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian#else
228e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian        l.objPosition = l.position;
229e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian#endif
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        vnorm3(l.normalizedObjPosition.v, l.objPosition.v);
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
232e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian    const vec4_t eyeViewer = { 0, 0, 0x10000, 0 };
233e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian#if OBJECT_SPACE_LIGHTING
234e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian    c->transforms.mvui.point3(&c->transforms.mvui,
235e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian            &c->lighting.objViewer, &eyeViewer);
236e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian    vnorm3(c->lighting.objViewer.v, c->lighting.objViewer.v);
237e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian#else
238e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian    c->lighting.objViewer = eyeViewer;
239e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian#endif
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic inline void validate_light(ogles_context_t* c)
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // if colorMaterial is enabled, we get the color from the vertex
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!c->lighting.colorMaterial.enable) {
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        material_t& material = c->lighting.front;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t en = c->lighting.enabledLights;
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (en) {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const int i = 31 - gglClz(en);
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            en &= ~(1<<i);
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            light_t& l = c->lighting.lights[i];
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            vmul3(l.implicitAmbient.v,  material.ambient.v,  l.ambient.v);
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            vmul3(l.implicitDiffuse.v,  material.diffuse.v,  l.diffuse.v);
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            vmul3(l.implicitSpecular.v, material.specular.v, l.specular.v);
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // this is just a flag to tell if we have a specular component
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            l.implicitSpecular.v[3] =
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    l.implicitSpecular.r |
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    l.implicitSpecular.g |
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    l.implicitSpecular.b;
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            l.rConstAttenuation = (l.attenuation[1] | l.attenuation[2])==0;
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (l.rConstAttenuation)
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                l.rConstAttenuation = gglRecipFast(l.attenuation[0]);
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // emission and ambient for the whole scene
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        vmla3(  c->lighting.implicitSceneEmissionAndAmbient.v,
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                c->lighting.lightModel.ambient.v,
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                material.ambient.v,
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                material.emission.v);
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->lighting.implicitSceneEmissionAndAmbient.a = material.diffuse.a;
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    validate_light_mvi(c);
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid invalidate_lighting(ogles_context_t* c)
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: pick lightVertexValidate or lightVertexValidateMVI
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // instead of systematically the heavier lightVertexValidate()
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.lightVertex = lightVertexValidate;
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid ogles_invalidate_lighting_mvui(ogles_context_t* c)
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    invalidate_lighting(c);
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid lightVertexNop(ogles_context_t*, vertex_t* v)
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // we should never end-up here
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid lightVertexValidateMVI(ogles_context_t* c, vertex_t* v)
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    validate_light_mvi(c);
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    light_picker(c);
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.lightVertex(c, v);
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid lightVertexValidate(ogles_context_t* c, vertex_t* v)
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    validate_light(c);
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    light_picker(c);
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.lightVertex(c, v);
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid lightVertexMaterial(ogles_context_t* c, vertex_t* v)
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // fetch the material color
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const GLvoid* cp = c->arrays.color.element(
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            v->index & vertex_cache_t::INDEX_MASK);
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->arrays.color.fetch(c, v->color.v, cp);
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // acquire the color-material from the vertex
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    material_t& material = c->lighting.front;
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    material.ambient =
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    material.diffuse = v->color;
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // implicit arguments need to be computed per/vertex
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t en = c->lighting.enabledLights;
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (en) {
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const int i = 31 - gglClz(en);
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        en &= ~(1<<i);
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        light_t& l = c->lighting.lights[i];
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        vmul3(l.implicitAmbient.v,  material.ambient.v,  l.ambient.v);
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        vmul3(l.implicitDiffuse.v,  material.diffuse.v,  l.diffuse.v);
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        vmul3(l.implicitSpecular.v, material.specular.v, l.specular.v);
3277c7dface993a66778c506179ae11cadd6a88f7b1Mathias Agopian        // this is just a flag to tell if we have a specular component
3287c7dface993a66778c506179ae11cadd6a88f7b1Mathias Agopian        l.implicitSpecular.v[3] =
3297c7dface993a66778c506179ae11cadd6a88f7b1Mathias Agopian                l.implicitSpecular.r |
3307c7dface993a66778c506179ae11cadd6a88f7b1Mathias Agopian                l.implicitSpecular.g |
3317c7dface993a66778c506179ae11cadd6a88f7b1Mathias Agopian                l.implicitSpecular.b;
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // emission and ambient for the whole scene
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vmla3(  c->lighting.implicitSceneEmissionAndAmbient.v,
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->lighting.lightModel.ambient.v,
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            material.ambient.v,
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            material.emission.v);
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.implicitSceneEmissionAndAmbient.a = material.diffuse.a;
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // now we can light our vertex as usual
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    lightVertex(c, v);
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid lightVertex(ogles_context_t* c, vertex_t* v)
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // emission and ambient for the whole scene
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    vec4_t r = c->lighting.implicitSceneEmissionAndAmbient;
348e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian    const vec4_t objViewer = c->lighting.objViewer;
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t en = c->lighting.enabledLights;
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ggl_likely(en)) {
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // since we do the lighting in object-space, we don't need to
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // transform each normal. However, we might still have to normalize
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // it if GL_NORMALIZE is enabled.
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        vec4_t n;
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->arrays.normal.fetch(c, n.v,
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->arrays.normal.element(v->index & vertex_cache_t::INDEX_MASK));
358cede1ed3e1721dc4a697a540388ef0f4b51c60ebMathias Agopian
359e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian#if !OBJECT_SPACE_LIGHTING
360e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian        c->transforms.mvui.point3(&c->transforms.mvui, &n, &n);
361e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian#endif
362e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian
363e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian        // TODO: right now we handle GL_RESCALE_NORMALS as if it were
364cede1ed3e1721dc4a697a540388ef0f4b51c60ebMathias Agopian        // GL_NORMALIZE. We could optimize this by  scaling mvui
365cede1ed3e1721dc4a697a540388ef0f4b51c60ebMathias Agopian        // appropriately instead.
366cede1ed3e1721dc4a697a540388ef0f4b51c60ebMathias Agopian        if (c->transforms.rescaleNormals)
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            vnorm3(n.v, n.v);
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const material_t& material = c->lighting.front;
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const int twoSide = c->lighting.lightModel.twoSide;
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (en) {
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const int i = 31 - gglClz(en);
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            en &= ~(1<<i);
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const light_t& l = c->lighting.lights[i];
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            vec4_t d, t;
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            GLfixed s;
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            GLfixed sqDist = 0x10000;
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // compute vertex-to-light vector
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ggl_unlikely(l.position.w)) {
383cede1ed3e1721dc4a697a540388ef0f4b51c60ebMathias Agopian                // lightPos/1.0 - vertex/vertex.w == lightPos*vertex.w - vertex
384cede1ed3e1721dc4a697a540388ef0f4b51c60ebMathias Agopian                vss3(d.v, l.objPosition.v, v->obj.w, v->obj.v);
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sqDist = dot3(d.v, d.v);
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                vscale3(d.v, d.v, gglSqrtRecipx(sqDist));
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // TODO: avoid copy here
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                d = l.normalizedObjPosition;
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // ambient & diffuse
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s = dot3(n.v, d.v);
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s = (s<0) ? (twoSide?(-s):0) : s;
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            vsa3(t.v, l.implicitDiffuse.v, s, l.implicitAmbient.v);
396e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // specular
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ggl_unlikely(s && l.implicitSpecular.v[3])) {
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                vec4_t h;
400e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian                h.x = d.x + objViewer.x;
401e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian                h.y = d.y + objViewer.y;
402e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian                h.z = d.z + objViewer.z;
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                vnorm3(h.v, h.v);
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                s = dot3(n.v, h.v);
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                s = (s<0) ? (twoSide?(-s):0) : s;
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (s > 0) {
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s = gglPowx(s, material.shininess);
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    vsa3(t.v, l.implicitSpecular.v, s, t.v);
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // spot
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ggl_unlikely(l.spotCutoff != gglIntToFixed(180))) {
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GLfixed spotAtt = -dot3(l.normalizedSpotDir.v, d.v);
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (spotAtt >= l.spotCutoffCosine) {
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    vscale3(t.v, t.v, gglPowx(spotAtt, l.spotExp));
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // attenuation
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ggl_unlikely(l.position.w)) {
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (l.rConstAttenuation) {
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s = l.rConstAttenuation;
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s = gglMulAddx(sqDist, l.attenuation[2], l.attenuation[0]);
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (l.attenuation[1])
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        s = gglMulAddx(gglSqrtx(sqDist), l.attenuation[1], s);
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s = gglRecipFast(s);
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                vscale3(t.v, t.v, s);
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            r.r += t.r;
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            r.g += t.g;
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            r.b += t.b;
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    v->color.r = gglClampx(r.r);
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    v->color.g = gglClampx(r.g);
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    v->color.b = gglClampx(r.b);
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    v->color.a = gglClampx(r.a);
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    v->flags |= vertex_t::LIT;
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void lightModelx(GLenum pname, GLfixed param, ogles_context_t* c)
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ggl_unlikely(pname != GL_LIGHT_MODEL_TWO_SIDE)) {
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.lightModel.twoSide = param ? GL_TRUE : GL_FALSE;
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    invalidate_lighting(c);
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void lightx(GLenum i, GLenum pname, GLfixed param, ogles_context_t* c)
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ggl_unlikely(uint32_t(i-GL_LIGHT0) >= OGLES_MAX_LIGHTS)) {
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    light_t& light = c->lighting.lights[i-GL_LIGHT0];
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const GLfixed kDegToRad = GLfixed((M_PI * gglIntToFixed(1)) / 180.0f);
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (pname) {
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_SPOT_EXPONENT:
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (GGLfixed(param) >= gglIntToFixed(128)) {
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ogles_error(c, GL_INVALID_VALUE);
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        light.spotExp = param;
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_SPOT_CUTOFF:
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (param!=gglIntToFixed(180) && GGLfixed(param)>=gglIntToFixed(90)) {
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ogles_error(c, GL_INVALID_VALUE);
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        light.spotCutoff = param;
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        light.spotCutoffCosine =
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                gglFloatToFixed(cosinef((M_PI/(180.0f*65536.0f))*param));
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_CONSTANT_ATTENUATION:
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (param < 0) {
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ogles_error(c, GL_INVALID_VALUE);
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        light.attenuation[0] = param;
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_LINEAR_ATTENUATION:
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (param < 0) {
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ogles_error(c, GL_INVALID_VALUE);
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        light.attenuation[1] = param;
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_QUADRATIC_ATTENUATION:
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (param < 0) {
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ogles_error(c, GL_INVALID_VALUE);
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        light.attenuation[2] = param;
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    default:
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    invalidate_lighting(c);
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void lightxv(GLenum i, GLenum pname, const GLfixed *params, ogles_context_t* c)
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ggl_unlikely(uint32_t(i-GL_LIGHT0) >= OGLES_MAX_LIGHTS)) {
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfixed* what;
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    light_t& light = c->lighting.lights[i-GL_LIGHT0];
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (pname) {
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_AMBIENT:
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        what = light.ambient.v;
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_DIFFUSE:
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        what = light.diffuse.v;
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_SPECULAR:
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        what = light.specular.v;
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_POSITION: {
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_validate_transform(c, transform_state_t::MODELVIEW);
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        transform_t& mv = c->transforms.modelview.transform;
531e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian        mv.point4(&mv, &light.position, reinterpret_cast<vec4_t const*>(params));
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        invalidate_lighting(c);
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_SPOT_DIRECTION: {
536e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian#if OBJECT_SPACE_LIGHTING
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_validate_transform(c, transform_state_t::MVUI);
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        transform_t& mvui = c->transforms.mvui;
539e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian        mvui.point3(&mvui, &light.spotDir, reinterpret_cast<vec4_t const*>(params));
540e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian#else
541e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian        light.spotDir = *reinterpret_cast<vec4_t const*>(params);
542e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian#endif
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        vnorm3(light.normalizedSpotDir.v, light.spotDir.v);
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        invalidate_lighting(c);
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    default:
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        lightx(i, pname, params[0], c);
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    what[0] = params[0];
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    what[1] = params[1];
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    what[2] = params[2];
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    what[3] = params[3];
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    invalidate_lighting(c);
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void materialx(GLenum face, GLenum pname, GLfixed param, ogles_context_t* c)
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ggl_unlikely(face != GL_FRONT_AND_BACK)) {
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ggl_unlikely(pname != GL_SHININESS)) {
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.front.shininess = param;
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    invalidate_lighting(c);
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void fogx(GLenum pname, GLfixed param, ogles_context_t* c)
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (pname) {
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_FOG_DENSITY:
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (param >= 0) {
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->fog.density = param;
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_VALUE);
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_FOG_START:
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->fog.start = param;
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->fog.invEndMinusStart = gglRecip(c->fog.end - c->fog.start);
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_FOG_END:
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->fog.end = param;
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->fog.invEndMinusStart = gglRecip(c->fog.end - c->fog.start);
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_FOG_MODE:
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (param) {
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case GL_LINEAR:
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->fog.mode = param;
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->fog.fog = fog_linear;
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case GL_EXP:
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->fog.mode = param;
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->fog.fog = fog_exp;
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case GL_EXP2:
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->fog.mode = param;
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->fog.fog = fog_exp2;
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ogles_error(c, GL_INVALID_ENUM);
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    default:
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android;
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark -
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark lighting APIs
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glShadeModel(GLenum mode)
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ggl_unlikely(mode != GL_SMOOTH && mode != GL_FLAT)) {
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.shadeModel = mode;
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glLightModelf(GLenum pname, GLfloat param)
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    lightModelx(pname, gglFloatToFixed(param), c);
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glLightModelx(GLenum pname, GLfixed param)
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    lightModelx(pname, param, c);
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glLightModelfv(GLenum pname, const GLfloat *params)
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (pname == GL_LIGHT_MODEL_TWO_SIDE) {
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        lightModelx(pname, gglFloatToFixed(params[0]), c);
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ggl_unlikely(pname != GL_LIGHT_MODEL_AMBIENT)) {
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.lightModel.ambient.r = gglFloatToFixed(params[0]);
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.lightModel.ambient.g = gglFloatToFixed(params[1]);
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.lightModel.ambient.b = gglFloatToFixed(params[2]);
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.lightModel.ambient.a = gglFloatToFixed(params[3]);
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    invalidate_lighting(c);
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glLightModelxv(GLenum pname, const GLfixed *params)
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (pname == GL_LIGHT_MODEL_TWO_SIDE) {
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        lightModelx(pname, params[0], c);
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ggl_unlikely(pname != GL_LIGHT_MODEL_AMBIENT)) {
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.lightModel.ambient.r = params[0];
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.lightModel.ambient.g = params[1];
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.lightModel.ambient.b = params[2];
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->lighting.lightModel.ambient.a = params[3];
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    invalidate_lighting(c);
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark -
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glLightf(GLenum i, GLenum pname, GLfloat param)
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    lightx(i, pname, gglFloatToFixed(param), c);
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glLightx(GLenum i, GLenum pname, GLfixed param)
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    lightx(i, pname, param, c);
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glLightfv(GLenum i, GLenum pname, const GLfloat *params)
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (pname) {
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_SPOT_EXPONENT:
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_SPOT_CUTOFF:
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_CONSTANT_ATTENUATION:
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_LINEAR_ATTENUATION:
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_QUADRATIC_ATTENUATION:
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        lightx(i, pname, gglFloatToFixed(params[0]), c);
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfixed paramsx[4];
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    paramsx[0] = gglFloatToFixed(params[0]);
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    paramsx[1] = gglFloatToFixed(params[1]);
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    paramsx[2] = gglFloatToFixed(params[2]);
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (pname != GL_SPOT_DIRECTION)
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        paramsx[3] = gglFloatToFixed(params[3]);
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    lightxv(i, pname, paramsx, c);
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glLightxv(GLenum i, GLenum pname, const GLfixed *params)
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    lightxv(i, pname, params, c);
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark -
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glMaterialf(GLenum face, GLenum pname, GLfloat param)
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    materialx(face, pname, gglFloatToFixed(param), c);
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glMaterialx(GLenum face, GLenum pname, GLfixed param)
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    materialx(face, pname, param, c);
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glMaterialfv(
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLenum face, GLenum pname, const GLfloat *params)
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ggl_unlikely(face != GL_FRONT_AND_BACK)) {
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfixed* what=0;
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfixed* other=0;
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (pname) {
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_AMBIENT:    what = c->lighting.front.ambient.v; break;
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_DIFFUSE:    what = c->lighting.front.diffuse.v; break;
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_SPECULAR:   what = c->lighting.front.specular.v; break;
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_EMISSION:   what = c->lighting.front.emission.v; break;
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_AMBIENT_AND_DIFFUSE:
767e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian        what  = c->lighting.front.ambient.v;
768e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian        other = c->lighting.front.diffuse.v;
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_SHININESS:
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->lighting.front.shininess = gglFloatToFixed(params[0]);
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        invalidate_lighting(c);
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    default:
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    what[0] = gglFloatToFixed(params[0]);
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    what[1] = gglFloatToFixed(params[1]);
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    what[2] = gglFloatToFixed(params[2]);
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    what[3] = gglFloatToFixed(params[3]);
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (other) {
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        other[0] = what[0];
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        other[1] = what[1];
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        other[2] = what[2];
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        other[3] = what[3];
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    invalidate_lighting(c);
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glMaterialxv(
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLenum face, GLenum pname, const GLfixed *params)
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ggl_unlikely(face != GL_FRONT_AND_BACK)) {
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfixed* what=0;
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfixed* other=0;
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (pname) {
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_AMBIENT:    what = c->lighting.front.ambient.v; break;
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_DIFFUSE:    what = c->lighting.front.diffuse.v; break;
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_SPECULAR:   what = c->lighting.front.specular.v; break;
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_EMISSION:   what = c->lighting.front.emission.v; break;
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_AMBIENT_AND_DIFFUSE:
807e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian        what  = c->lighting.front.ambient.v;
808e304bdd5ee5ed0b0d37fe388021c9cd138feda7fMathias Agopian        other = c->lighting.front.diffuse.v;
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case GL_SHININESS:
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->lighting.front.shininess = gglFloatToFixed(params[0]);
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        invalidate_lighting(c);
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    default:
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    what[0] = params[0];
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    what[1] = params[1];
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    what[2] = params[2];
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    what[3] = params[3];
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (other) {
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        other[0] = what[0];
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        other[1] = what[1];
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        other[2] = what[2];
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        other[3] = what[3];
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    invalidate_lighting(c);
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark -
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark fog
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glFogf(GLenum pname, GLfloat param) {
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfixed paramx = (GLfixed)param;
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (pname != GL_FOG_MODE)
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        paramx = gglFloatToFixed(param);
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    fogx(pname, paramx, c);
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glFogx(GLenum pname, GLfixed param) {
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    fogx(pname, param, c);
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glFogfv(GLenum pname, const GLfloat *params)
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (pname != GL_FOG_COLOR) {
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GLfixed paramx = (GLfixed)params[0];
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pname != GL_FOG_MODE)
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            paramx = gglFloatToFixed(params[0]);
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fogx(pname, paramx, c);
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLfixed paramsx[4];
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    paramsx[0] = gglFloatToFixed(params[0]);
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    paramsx[1] = gglFloatToFixed(params[1]);
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    paramsx[2] = gglFloatToFixed(params[2]);
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    paramsx[3] = gglFloatToFixed(params[3]);
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->rasterizer.procs.fogColor3xv(c, paramsx);
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glFogxv(GLenum pname, const GLfixed *params)
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (pname != GL_FOG_COLOR) {
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fogx(pname, params[0], c);
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->rasterizer.procs.fogColor3xv(c, params);
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
877