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