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