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 220c0dea964913268bd64009e657635e617f3e0c21cMartin Storsjo const vec4_t eyeViewer = { 0, 0, 0x1000, 0 }; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (en) { 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int i = 31 - gglClz(en); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project en &= ~(1<<i); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project light_t& l = c->lighting.lights[i]; 225cede1ed3e1721dc4a697a540388ef0f4b51c60ebMathias Agopian c->transforms.mvui.point4(&c->transforms.mvui, 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &l.objPosition, &l.position); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vnorm3(l.normalizedObjPosition.v, l.objPosition.v); 228c0dea964913268bd64009e657635e617f3e0c21cMartin Storsjo c->transforms.mvui.point4(&c->transforms.mvui, 229c0dea964913268bd64009e657635e617f3e0c21cMartin Storsjo &l.objViewer, &eyeViewer); 230c0dea964913268bd64009e657635e617f3e0c21cMartin Storsjo vnorm3(l.objViewer.v, l.objViewer.v); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic inline void validate_light(ogles_context_t* c) 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if colorMaterial is enabled, we get the color from the vertex 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!c->lighting.colorMaterial.enable) { 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project material_t& material = c->lighting.front; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t en = c->lighting.enabledLights; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (en) { 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int i = 31 - gglClz(en); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project en &= ~(1<<i); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project light_t& l = c->lighting.lights[i]; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vmul3(l.implicitAmbient.v, material.ambient.v, l.ambient.v); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vmul3(l.implicitDiffuse.v, material.diffuse.v, l.diffuse.v); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vmul3(l.implicitSpecular.v, material.specular.v, l.specular.v); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this is just a flag to tell if we have a specular component 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.implicitSpecular.v[3] = 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.implicitSpecular.r | 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.implicitSpecular.g | 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.implicitSpecular.b; 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.rConstAttenuation = (l.attenuation[1] | l.attenuation[2])==0; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (l.rConstAttenuation) 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.rConstAttenuation = gglRecipFast(l.attenuation[0]); 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // emission and ambient for the whole scene 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vmla3( c->lighting.implicitSceneEmissionAndAmbient.v, 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->lighting.lightModel.ambient.v, 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project material.ambient.v, 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project material.emission.v); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->lighting.implicitSceneEmissionAndAmbient.a = material.diffuse.a; 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project validate_light_mvi(c); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid invalidate_lighting(ogles_context_t* c) 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: pick lightVertexValidate or lightVertexValidateMVI 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // instead of systematically the heavier lightVertexValidate() 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->lighting.lightVertex = lightVertexValidate; 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid ogles_invalidate_lighting_mvui(ogles_context_t* c) 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate_lighting(c); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid lightVertexNop(ogles_context_t*, vertex_t* v) 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we should never end-up here 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid lightVertexValidateMVI(ogles_context_t* c, vertex_t* v) 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project validate_light_mvi(c); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project light_picker(c); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->lighting.lightVertex(c, v); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid lightVertexValidate(ogles_context_t* c, vertex_t* v) 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project validate_light(c); 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project light_picker(c); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->lighting.lightVertex(c, v); 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid lightVertexMaterial(ogles_context_t* c, vertex_t* v) 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // fetch the material color 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const GLvoid* cp = c->arrays.color.element( 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v->index & vertex_cache_t::INDEX_MASK); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->arrays.color.fetch(c, v->color.v, cp); 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // acquire the color-material from the vertex 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project material_t& material = c->lighting.front; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project material.ambient = 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project material.diffuse = v->color; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // implicit arguments need to be computed per/vertex 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t en = c->lighting.enabledLights; 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (en) { 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int i = 31 - gglClz(en); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project en &= ~(1<<i); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project light_t& l = c->lighting.lights[i]; 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vmul3(l.implicitAmbient.v, material.ambient.v, l.ambient.v); 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vmul3(l.implicitDiffuse.v, material.diffuse.v, l.diffuse.v); 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vmul3(l.implicitSpecular.v, material.specular.v, l.specular.v); 3197c7dface993a66778c506179ae11cadd6a88f7b1Mathias Agopian // this is just a flag to tell if we have a specular component 3207c7dface993a66778c506179ae11cadd6a88f7b1Mathias Agopian l.implicitSpecular.v[3] = 3217c7dface993a66778c506179ae11cadd6a88f7b1Mathias Agopian l.implicitSpecular.r | 3227c7dface993a66778c506179ae11cadd6a88f7b1Mathias Agopian l.implicitSpecular.g | 3237c7dface993a66778c506179ae11cadd6a88f7b1Mathias Agopian l.implicitSpecular.b; 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // emission and ambient for the whole scene 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vmla3( c->lighting.implicitSceneEmissionAndAmbient.v, 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->lighting.lightModel.ambient.v, 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project material.ambient.v, 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project material.emission.v); 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->lighting.implicitSceneEmissionAndAmbient.a = material.diffuse.a; 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // now we can light our vertex as usual 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lightVertex(c, v); 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid lightVertex(ogles_context_t* c, vertex_t* v) 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // emission and ambient for the whole scene 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vec4_t r = c->lighting.implicitSceneEmissionAndAmbient; 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t en = c->lighting.enabledLights; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ggl_likely(en)) { 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // since we do the lighting in object-space, we don't need to 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // transform each normal. However, we might still have to normalize 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it if GL_NORMALIZE is enabled. 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vec4_t n; 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->arrays.normal.fetch(c, n.v, 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->arrays.normal.element(v->index & vertex_cache_t::INDEX_MASK)); 349cede1ed3e1721dc4a697a540388ef0f4b51c60ebMathias Agopian 350cede1ed3e1721dc4a697a540388ef0f4b51c60ebMathias Agopian // TODO: right now we handle GL_RESCALE_NORMALS as if ti were 351cede1ed3e1721dc4a697a540388ef0f4b51c60ebMathias Agopian // GL_NORMALIZE. We could optimize this by scaling mvui 352cede1ed3e1721dc4a697a540388ef0f4b51c60ebMathias Agopian // appropriately instead. 353cede1ed3e1721dc4a697a540388ef0f4b51c60ebMathias Agopian if (c->transforms.rescaleNormals) 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vnorm3(n.v, n.v); 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const material_t& material = c->lighting.front; 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int twoSide = c->lighting.lightModel.twoSide; 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (en) { 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int i = 31 - gglClz(en); 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project en &= ~(1<<i); 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const light_t& l = c->lighting.lights[i]; 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vec4_t d, t; 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GLfixed s; 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GLfixed sqDist = 0x10000; 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // compute vertex-to-light vector 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ggl_unlikely(l.position.w)) { 370cede1ed3e1721dc4a697a540388ef0f4b51c60ebMathias Agopian // lightPos/1.0 - vertex/vertex.w == lightPos*vertex.w - vertex 371cede1ed3e1721dc4a697a540388ef0f4b51c60ebMathias Agopian vss3(d.v, l.objPosition.v, v->obj.w, v->obj.v); 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sqDist = dot3(d.v, d.v); 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vscale3(d.v, d.v, gglSqrtRecipx(sqDist)); 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: avoid copy here 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d = l.normalizedObjPosition; 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ambient & diffuse 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = dot3(n.v, d.v); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = (s<0) ? (twoSide?(-s):0) : s; 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vsa3(t.v, l.implicitDiffuse.v, s, l.implicitAmbient.v); 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // specular 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ggl_unlikely(s && l.implicitSpecular.v[3])) { 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vec4_t h; 387c0dea964913268bd64009e657635e617f3e0c21cMartin Storsjo h.x = d.x + l.objViewer.x; 388c0dea964913268bd64009e657635e617f3e0c21cMartin Storsjo h.y = d.y + l.objViewer.y; 389c0dea964913268bd64009e657635e617f3e0c21cMartin Storsjo h.z = d.z + l.objViewer.z; 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vnorm3(h.v, h.v); 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = dot3(n.v, h.v); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = (s<0) ? (twoSide?(-s):0) : s; 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s > 0) { 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = gglPowx(s, material.shininess); 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vsa3(t.v, l.implicitSpecular.v, s, t.v); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // spot 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ggl_unlikely(l.spotCutoff != gglIntToFixed(180))) { 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GLfixed spotAtt = -dot3(l.normalizedSpotDir.v, d.v); 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (spotAtt >= l.spotCutoffCosine) { 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vscale3(t.v, t.v, gglPowx(spotAtt, l.spotExp)); 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // attenuation 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ggl_unlikely(l.position.w)) { 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (l.rConstAttenuation) { 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = l.rConstAttenuation; 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = gglMulAddx(sqDist, l.attenuation[2], l.attenuation[0]); 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (l.attenuation[1]) 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = gglMulAddx(gglSqrtx(sqDist), l.attenuation[1], s); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = gglRecipFast(s); 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vscale3(t.v, t.v, s); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.r += t.r; 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.g += t.g; 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.b += t.b; 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v->color.r = gglClampx(r.r); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v->color.g = gglClampx(r.g); 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v->color.b = gglClampx(r.b); 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v->color.a = gglClampx(r.a); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v->flags |= vertex_t::LIT; 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void lightModelx(GLenum pname, GLfixed param, ogles_context_t* c) 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ggl_unlikely(pname != GL_LIGHT_MODEL_TWO_SIDE)) { 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->lighting.lightModel.twoSide = param ? GL_TRUE : GL_FALSE; 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate_lighting(c); 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void lightx(GLenum i, GLenum pname, GLfixed param, ogles_context_t* c) 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ggl_unlikely(uint32_t(i-GL_LIGHT0) >= OGLES_MAX_LIGHTS)) { 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project light_t& light = c->lighting.lights[i-GL_LIGHT0]; 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const GLfixed kDegToRad = GLfixed((M_PI * gglIntToFixed(1)) / 180.0f); 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (pname) { 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_SPOT_EXPONENT: 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (GGLfixed(param) >= gglIntToFixed(128)) { 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project light.spotExp = param; 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_SPOT_CUTOFF: 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (param!=gglIntToFixed(180) && GGLfixed(param)>=gglIntToFixed(90)) { 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project light.spotCutoff = param; 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project light.spotCutoffCosine = 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gglFloatToFixed(cosinef((M_PI/(180.0f*65536.0f))*param)); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_CONSTANT_ATTENUATION: 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (param < 0) { 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project light.attenuation[0] = param; 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_LINEAR_ATTENUATION: 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (param < 0) { 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project light.attenuation[1] = param; 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_QUADRATIC_ATTENUATION: 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (param < 0) { 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project light.attenuation[2] = param; 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate_lighting(c); 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void lightxv(GLenum i, GLenum pname, const GLfixed *params, ogles_context_t* c) 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ggl_unlikely(uint32_t(i-GL_LIGHT0) >= OGLES_MAX_LIGHTS)) { 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GLfixed* what; 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project light_t& light = c->lighting.lights[i-GL_LIGHT0]; 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (pname) { 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_AMBIENT: 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project what = light.ambient.v; 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_DIFFUSE: 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project what = light.diffuse.v; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_SPECULAR: 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project what = light.specular.v; 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_POSITION: { 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_validate_transform(c, transform_state_t::MODELVIEW); 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project transform_t& mv = c->transforms.modelview.transform; 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memcpy(light.position.v, params, sizeof(light.position.v)); 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mv.point4(&mv, &light.position, &light.position); 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate_lighting(c); 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_SPOT_DIRECTION: { 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_validate_transform(c, transform_state_t::MVUI); 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project transform_t& mvui = c->transforms.mvui; 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mvui.point3(&mvui, &light.spotDir, (vec4_t*)params); 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vnorm3(light.normalizedSpotDir.v, light.spotDir.v); 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate_lighting(c); 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lightx(i, pname, params[0], c); 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project what[0] = params[0]; 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project what[1] = params[1]; 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project what[2] = params[2]; 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project what[3] = params[3]; 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate_lighting(c); 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void materialx(GLenum face, GLenum pname, GLfixed param, ogles_context_t* c) 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ggl_unlikely(face != GL_FRONT_AND_BACK)) { 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ggl_unlikely(pname != GL_SHININESS)) { 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->lighting.front.shininess = param; 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate_lighting(c); 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void fogx(GLenum pname, GLfixed param, ogles_context_t* c) 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (pname) { 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_FOG_DENSITY: 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (param >= 0) { 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->fog.density = param; 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_FOG_START: 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->fog.start = param; 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->fog.invEndMinusStart = gglRecip(c->fog.end - c->fog.start); 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_FOG_END: 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->fog.end = param; 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->fog.invEndMinusStart = gglRecip(c->fog.end - c->fog.start); 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_FOG_MODE: 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (param) { 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_LINEAR: 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->fog.mode = param; 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->fog.fog = fog_linear; 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_EXP: 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->fog.mode = param; 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->fog.fog = fog_exp; 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_EXP2: 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->fog.mode = param; 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->fog.fog = fog_exp2; 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android; 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark - 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark lighting APIs 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glShadeModel(GLenum mode) 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ggl_unlikely(mode != GL_SMOOTH && mode != GL_FLAT)) { 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->lighting.shadeModel = mode; 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glLightModelf(GLenum pname, GLfloat param) 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lightModelx(pname, gglFloatToFixed(param), c); 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glLightModelx(GLenum pname, GLfixed param) 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lightModelx(pname, param, c); 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glLightModelfv(GLenum pname, const GLfloat *params) 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pname == GL_LIGHT_MODEL_TWO_SIDE) { 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lightModelx(pname, gglFloatToFixed(params[0]), c); 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ggl_unlikely(pname != GL_LIGHT_MODEL_AMBIENT)) { 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->lighting.lightModel.ambient.r = gglFloatToFixed(params[0]); 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->lighting.lightModel.ambient.g = gglFloatToFixed(params[1]); 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->lighting.lightModel.ambient.b = gglFloatToFixed(params[2]); 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->lighting.lightModel.ambient.a = gglFloatToFixed(params[3]); 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate_lighting(c); 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glLightModelxv(GLenum pname, const GLfixed *params) 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pname == GL_LIGHT_MODEL_TWO_SIDE) { 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lightModelx(pname, params[0], c); 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ggl_unlikely(pname != GL_LIGHT_MODEL_AMBIENT)) { 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->lighting.lightModel.ambient.r = params[0]; 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->lighting.lightModel.ambient.g = params[1]; 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->lighting.lightModel.ambient.b = params[2]; 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->lighting.lightModel.ambient.a = params[3]; 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate_lighting(c); 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark - 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glLightf(GLenum i, GLenum pname, GLfloat param) 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lightx(i, pname, gglFloatToFixed(param), c); 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glLightx(GLenum i, GLenum pname, GLfixed param) 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lightx(i, pname, param, c); 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glLightfv(GLenum i, GLenum pname, const GLfloat *params) 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (pname) { 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_SPOT_EXPONENT: 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_SPOT_CUTOFF: 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_CONSTANT_ATTENUATION: 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_LINEAR_ATTENUATION: 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_QUADRATIC_ATTENUATION: 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lightx(i, pname, gglFloatToFixed(params[0]), c); 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GLfixed paramsx[4]; 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project paramsx[0] = gglFloatToFixed(params[0]); 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project paramsx[1] = gglFloatToFixed(params[1]); 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project paramsx[2] = gglFloatToFixed(params[2]); 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pname != GL_SPOT_DIRECTION) 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project paramsx[3] = gglFloatToFixed(params[3]); 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lightxv(i, pname, paramsx, c); 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glLightxv(GLenum i, GLenum pname, const GLfixed *params) 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lightxv(i, pname, params, c); 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark - 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glMaterialf(GLenum face, GLenum pname, GLfloat param) 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project materialx(face, pname, gglFloatToFixed(param), c); 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glMaterialx(GLenum face, GLenum pname, GLfixed param) 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project materialx(face, pname, param, c); 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glMaterialfv( 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GLenum face, GLenum pname, const GLfloat *params) 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ggl_unlikely(face != GL_FRONT_AND_BACK)) { 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GLfixed* what=0; 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GLfixed* other=0; 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (pname) { 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_AMBIENT: what = c->lighting.front.ambient.v; break; 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_DIFFUSE: what = c->lighting.front.diffuse.v; break; 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_SPECULAR: what = c->lighting.front.specular.v; break; 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_EMISSION: what = c->lighting.front.emission.v; break; 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_AMBIENT_AND_DIFFUSE: 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project what = c->lighting.front.ambient.v; break; 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project other = c->lighting.front.diffuse.v; break; 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_SHININESS: 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->lighting.front.shininess = gglFloatToFixed(params[0]); 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate_lighting(c); 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project what[0] = gglFloatToFixed(params[0]); 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project what[1] = gglFloatToFixed(params[1]); 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project what[2] = gglFloatToFixed(params[2]); 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project what[3] = gglFloatToFixed(params[3]); 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (other) { 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project other[0] = what[0]; 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project other[1] = what[1]; 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project other[2] = what[2]; 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project other[3] = what[3]; 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate_lighting(c); 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glMaterialxv( 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GLenum face, GLenum pname, const GLfixed *params) 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ggl_unlikely(face != GL_FRONT_AND_BACK)) { 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GLfixed* what=0; 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GLfixed* other=0; 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (pname) { 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_AMBIENT: what = c->lighting.front.ambient.v; break; 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_DIFFUSE: what = c->lighting.front.diffuse.v; break; 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_SPECULAR: what = c->lighting.front.specular.v; break; 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_EMISSION: what = c->lighting.front.emission.v; break; 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_AMBIENT_AND_DIFFUSE: 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project what = c->lighting.front.ambient.v; break; 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project other= c->lighting.front.diffuse.v; break; 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GL_SHININESS: 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->lighting.front.shininess = gglFloatToFixed(params[0]); 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate_lighting(c); 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project what[0] = params[0]; 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project what[1] = params[1]; 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project what[2] = params[2]; 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project what[3] = params[3]; 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (other) { 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project other[0] = what[0]; 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project other[1] = what[1]; 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project other[2] = what[2]; 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project other[3] = what[3]; 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate_lighting(c); 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 0 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark - 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#pragma mark fog 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glFogf(GLenum pname, GLfloat param) { 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GLfixed paramx = (GLfixed)param; 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pname != GL_FOG_MODE) 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project paramx = gglFloatToFixed(param); 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fogx(pname, paramx, c); 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glFogx(GLenum pname, GLfixed param) { 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fogx(pname, param, c); 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glFogfv(GLenum pname, const GLfloat *params) 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pname != GL_FOG_COLOR) { 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GLfixed paramx = (GLfixed)params[0]; 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pname != GL_FOG_MODE) 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project paramx = gglFloatToFixed(params[0]); 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fogx(pname, paramx, c); 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GLfixed paramsx[4]; 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project paramsx[0] = gglFloatToFixed(params[0]); 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project paramsx[1] = gglFloatToFixed(params[1]); 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project paramsx[2] = gglFloatToFixed(params[2]); 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project paramsx[3] = gglFloatToFixed(params[3]); 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->rasterizer.procs.fogColor3xv(c, paramsx); 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid glFogxv(GLenum pname, const GLfixed *params) 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pname != GL_FOG_COLOR) { 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fogx(pname, params[0], c); 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c->rasterizer.procs.fogColor3xv(c, params); 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 861