1cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell/* 2cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * Mesa 3-D graphics library 3b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul * Version: 5.1 422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 5b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul * Copyright (C) 1999-2003 Brian Paul All Rights Reserved. 622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 7cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 8cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * copy of this software and associated documentation files (the "Software"), 9cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * to deal in the Software without restriction, including without limitation 10cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * and/or sell copies of the Software, and to permit persons to whom the 12cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * Software is furnished to do so, subject to the following conditions: 1322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 14cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * The above copyright notice and this permission notice shall be included 15cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * in all copies or substantial portions of the Software. 1622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 17cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * 24cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * 25cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * Authors: 2605a4b37707d2c598ea68c05d07a3d65bcbf5a076Brian Paul * Brian Paul 2705a4b37707d2c598ea68c05d07a3d65bcbf5a076Brian Paul * Keith Whitwell <keith@tungstengraphics.com> 28cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 29cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 30cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 31462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane#if IDX & LIGHT_TWOSIDE 32cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell# define NR_SIDES 2 33cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#else 34cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell# define NR_SIDES 1 35cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#endif 36cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 37cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 38ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell/* define TRACE to trace lighting code */ 392d846b712c44ebcf7bedce43bb58765c7493d89eBrian Paul/* #define TRACE 1 */ 40cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul 41cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul/* 42cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul * ctx is the current context 43cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul * VB is the vertex buffer 44cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul * stage is the lighting stage-private data 45cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul * input is the vector of eye or object-space vertex coordinates 46cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul */ 47f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(light_rgba_spec)( struct gl_context *ctx, 48cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct vertex_buffer *VB, 49ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_pipeline_stage *stage, 50cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLvector4f *input ) 51cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 52cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct light_stage_data *store = LIGHT_STAGE_DATA(stage); 53cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat (*base)[3] = ctx->Light._BaseColor; 54ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat sumA[2]; 55cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint j; 56cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 57cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul const GLuint vstride = input->stride; 58cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell const GLfloat *vertex = (GLfloat *)input->data; 5962e1fae858509615c6e54e0b9388cfa2691a5919Brian Paul const GLuint nstride = VB->AttribPtr[_TNL_ATTRIB_NORMAL]->stride; 6062e1fae858509615c6e54e0b9388cfa2691a5919Brian Paul const GLfloat *normal = (GLfloat *)VB->AttribPtr[_TNL_ATTRIB_NORMAL]->data; 61cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 62ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat (*Fcolor)[4] = (GLfloat (*)[4]) store->LitColor[0].data; 63ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat (*Fspec)[4] = (GLfloat (*)[4]) store->LitSecondary[0].data; 64b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#if IDX & LIGHT_TWOSIDE 65b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul GLfloat (*Bcolor)[4] = (GLfloat (*)[4]) store->LitColor[1].data; 66ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat (*Bspec)[4] = (GLfloat (*)[4]) store->LitSecondary[1].data; 67b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#endif 68cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 69cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul const GLuint nr = VB->Count; 70cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 71cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul#ifdef TRACE 72cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul fprintf(stderr, "%s\n", __FUNCTION__ ); 73cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul#endif 742448fc7deeaa870d879de17158f243f239c05b15Keith Whitwell 750a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt VB->AttribPtr[_TNL_ATTRIB_COLOR0] = &store->LitColor[0]; 760a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt VB->AttribPtr[_TNL_ATTRIB_COLOR1] = &store->LitSecondary[0]; 77ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell sumA[0] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]; 78cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 79b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#if IDX & LIGHT_TWOSIDE 800a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt VB->BackfaceColorPtr = &store->LitColor[1]; 810a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt VB->BackfaceSecondaryColorPtr = &store->LitSecondary[1]; 82b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul sumA[1] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]; 83b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#endif 84cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 85cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 86dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell store->LitColor[0].stride = 16; 87dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell store->LitColor[1].stride = 16; 88dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell 89ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell for (j = 0; j < nr; j++,STRIDE_F(vertex,vstride),STRIDE_F(normal,nstride)) { 9053560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell GLfloat sum[2][3], spec[2][3]; 91cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct gl_light *light; 9222144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 93b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#if IDX & LIGHT_MATERIAL 94b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul update_materials( ctx, store ); 95b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul sumA[0] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]; 96b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#if IDX & LIGHT_TWOSIDE 97b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul sumA[1] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]; 98b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#endif 99b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#endif 100cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 10153560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell COPY_3V(sum[0], base[0]); 10253560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell ZERO_3V(spec[0]); 103cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 104b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#if IDX & LIGHT_TWOSIDE 105b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul COPY_3V(sum[1], base[1]); 106b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul ZERO_3V(spec[1]); 107b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#endif 10822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 109cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* Add contribution from each enabled light source */ 110cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell foreach (light, &ctx->Light.EnabledList) { 111cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat n_dot_h; 112cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat correction; 11322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes GLint side; 114cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat contrib[3]; 115cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat attenuation; 116cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat VP[3]; /* unit vector from vertex to light */ 117cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat n_dot_VP; /* n dot VP */ 118cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat *h; 119cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 120cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* compute VP and attenuation */ 121cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (!(light->_Flags & LIGHT_POSITIONAL)) { 122cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* directional light */ 123cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell COPY_3V(VP, light->_VP_inf_norm); 124cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell attenuation = light->_VP_inf_spot_attenuation; 125cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 126cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell else { 127cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat d; /* distance from vertex to light */ 128cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 129cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell SUB_3V(VP, light->_Position, vertex); 130cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 131cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell d = (GLfloat) LEN_3FV( VP ); 132cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 133cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (d > 1e-6) { 134cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat invd = 1.0F / d; 135cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell SELF_SCALE_SCALAR_3V(VP, invd); 136cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 13722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 13822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes attenuation = 1.0F / (light->ConstantAttenuation + d * 13922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes (light->LinearAttenuation + d * 140cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell light->QuadraticAttenuation)); 141cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 142cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* spotlight attenuation */ 143cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (light->_Flags & LIGHT_SPOT) { 1447391ba1e9d81f15465059db25d1279eefdbeb1a9Brian Paul GLfloat PV_dot_dir = - DOT3(VP, light->_NormSpotDirection); 14522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 146cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (PV_dot_dir<light->_CosCutoff) { 147cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell continue; /* this light makes no contribution */ 148cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 149cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell else { 150ae509f88a54b9cc32f16099109330f2792593c83Brian Paul GLfloat spot = powf(PV_dot_dir, light->SpotExponent); 151cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell attenuation *= spot; 152cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 153cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 154cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 155cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 15622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes if (attenuation < 1e-3) 157cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell continue; /* this light makes no contribution */ 158cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 159cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* Compute dot product or normal and vector from V to light pos */ 160cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell n_dot_VP = DOT3( normal, VP ); 161cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 162cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* Which side gets the diffuse & specular terms? */ 163cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (n_dot_VP < 0.0F) { 16453560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell ACC_SCALE_SCALAR_3V(sum[0], attenuation, light->_MatAmbient[0]); 165b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#if IDX & LIGHT_TWOSIDE 16651c0c71811508b6658e0d5dcff8426b618322a73Keith Whitwell side = 1; 16753560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell correction = -1; 16853560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell n_dot_VP = -n_dot_VP; 169b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#else 170b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul continue; 171b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#endif 172cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 173cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell else { 174b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#if IDX & LIGHT_TWOSIDE 175b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul ACC_SCALE_SCALAR_3V( sum[1], attenuation, light->_MatAmbient[1]); 176b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#endif 17751c0c71811508b6658e0d5dcff8426b618322a73Keith Whitwell side = 0; 17853560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell correction = 1; 17922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes } 180cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 18153560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell /* diffuse term */ 18253560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell COPY_3V(contrib, light->_MatAmbient[side]); 18353560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell ACC_SCALE_SCALAR_3V(contrib, n_dot_VP, light->_MatDiffuse[side]); 18453560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell ACC_SCALE_SCALAR_3V(sum[side], attenuation, contrib ); 18553560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell 186cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* specular term - cannibalize VP... */ 187cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (ctx->Light.Model.LocalViewer) { 188cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat v[3]; 189cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell COPY_3V(v, vertex); 190cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell NORMALIZE_3FV(v); 191cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell SUB_3V(VP, VP, v); /* h = VP + VPe */ 192cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell h = VP; 193cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell NORMALIZE_3FV(h); 194cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 195cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell else if (light->_Flags & LIGHT_POSITIONAL) { 196cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell h = VP; 197cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ACC_3V(h, ctx->_EyeZDir); 198cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell NORMALIZE_3FV(h); 199cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 200cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell else { 201cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell h = light->_h_inf_norm; 202cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 20322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 204cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell n_dot_h = correction * DOT3(normal, h); 205cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 206cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (n_dot_h > 0.0F) { 207ba1d921bdf7a15fcc4a4e3162ea6fe9810f233d6Mathias Fröhlich GLfloat spec_coef = lookup_shininess(ctx, side, n_dot_h); 208cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (spec_coef > 1.0e-10) { 209cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell spec_coef *= attenuation; 21053560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell ACC_SCALE_SCALAR_3V( spec[side], spec_coef, 211cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell light->_MatSpecular[side]); 212cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 213cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 214cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } /*loop over lights*/ 21553560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell 216ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell COPY_3V( Fcolor[j], sum[0] ); 217ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell COPY_3V( Fspec[j], spec[0] ); 21853560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell Fcolor[j][3] = sumA[0]; 21953560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell 220b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#if IDX & LIGHT_TWOSIDE 221b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul COPY_3V( Bcolor[j], sum[1] ); 222b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul COPY_3V( Bspec[j], spec[1] ); 223b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul Bcolor[j][3] = sumA[1]; 224b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#endif 22522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes } 226cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 227cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 228cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 229f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(light_rgba)( struct gl_context *ctx, 230cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct vertex_buffer *VB, 231ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_pipeline_stage *stage, 232cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLvector4f *input ) 233cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 234cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct light_stage_data *store = LIGHT_STAGE_DATA(stage); 235cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint j; 236cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 237cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat (*base)[3] = ctx->Light._BaseColor; 238ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat sumA[2]; 239cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 240cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul const GLuint vstride = input->stride; 241cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell const GLfloat *vertex = (GLfloat *) input->data; 24262e1fae858509615c6e54e0b9388cfa2691a5919Brian Paul const GLuint nstride = VB->AttribPtr[_TNL_ATTRIB_NORMAL]->stride; 24362e1fae858509615c6e54e0b9388cfa2691a5919Brian Paul const GLfloat *normal = (GLfloat *)VB->AttribPtr[_TNL_ATTRIB_NORMAL]->data; 244cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 245ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat (*Fcolor)[4] = (GLfloat (*)[4]) store->LitColor[0].data; 24622ae633d1ea636e0e07ba044a0f8fa2195c83bc6Alan Hourihane#if IDX & LIGHT_TWOSIDE 247ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat (*Bcolor)[4] = (GLfloat (*)[4]) store->LitColor[1].data; 24822ae633d1ea636e0e07ba044a0f8fa2195c83bc6Alan Hourihane#endif 249cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 250cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul const GLuint nr = VB->Count; 251cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul 252cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul#ifdef TRACE 253cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul fprintf(stderr, "%s\n", __FUNCTION__ ); 254cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul#endif 255cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 2560a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt VB->AttribPtr[_TNL_ATTRIB_COLOR0] = &store->LitColor[0]; 257ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell sumA[0] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]; 25846af1f87c897ef03470d205e9fd147e93911cbceKeith Whitwell 259b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#if IDX & LIGHT_TWOSIDE 2600a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt VB->BackfaceColorPtr = &store->LitColor[1]; 261b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul sumA[1] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]; 262b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#endif 263cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 264dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell store->LitColor[0].stride = 16; 265dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell store->LitColor[1].stride = 16; 266dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell 267ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell for (j = 0; j < nr; j++,STRIDE_F(vertex,vstride),STRIDE_F(normal,nstride)) { 26853560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell GLfloat sum[2][3]; 269cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct gl_light *light; 270cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 271462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane#if IDX & LIGHT_MATERIAL 272462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane update_materials( ctx, store ); 273462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane sumA[0] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]; 274b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#if IDX & LIGHT_TWOSIDE 275462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane sumA[1] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]; 276462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane#endif 277b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#endif 278cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 27953560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell COPY_3V(sum[0], base[0]); 28022144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 281462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane#if IDX & LIGHT_TWOSIDE 282462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane COPY_3V(sum[1], base[1]); 283462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane#endif 28422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 285cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* Add contribution from each enabled light source */ 286cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell foreach (light, &ctx->Light.EnabledList) { 287cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 288cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat n_dot_h; 289cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat correction; 29022144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes GLint side; 291cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat contrib[3]; 292cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat attenuation = 1.0; 293cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat VP[3]; /* unit vector from vertex to light */ 294cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat n_dot_VP; /* n dot VP */ 295cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat *h; 296cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 297cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* compute VP and attenuation */ 298cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (!(light->_Flags & LIGHT_POSITIONAL)) { 299cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* directional light */ 300cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell COPY_3V(VP, light->_VP_inf_norm); 301cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell attenuation = light->_VP_inf_spot_attenuation; 302cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 303cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell else { 304cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat d; /* distance from vertex to light */ 305cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 306cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 307cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell SUB_3V(VP, light->_Position, vertex); 308cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 309edf8c06270a0e62f33e3f45e1f0307acfeff3b5dBrian Paul d = (GLfloat) LEN_3FV( VP ); 310cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 311cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if ( d > 1e-6) { 312cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat invd = 1.0F / d; 313cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell SELF_SCALE_SCALAR_3V(VP, invd); 314cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 315cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 31622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes attenuation = 1.0F / (light->ConstantAttenuation + d * 31722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes (light->LinearAttenuation + d * 318cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell light->QuadraticAttenuation)); 319cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 320cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* spotlight attenuation */ 321cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (light->_Flags & LIGHT_SPOT) { 3227391ba1e9d81f15465059db25d1279eefdbeb1a9Brian Paul GLfloat PV_dot_dir = - DOT3(VP, light->_NormSpotDirection); 323cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 324cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (PV_dot_dir<light->_CosCutoff) { 325cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell continue; /* this light makes no contribution */ 326cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 327cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell else { 328ae509f88a54b9cc32f16099109330f2792593c83Brian Paul GLfloat spot = powf(PV_dot_dir, light->SpotExponent); 329cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell attenuation *= spot; 330cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 331cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 332cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 333cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 33422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes if (attenuation < 1e-3) 335cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell continue; /* this light makes no contribution */ 336cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 337cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* Compute dot product or normal and vector from V to light pos */ 338cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell n_dot_VP = DOT3( normal, VP ); 339cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 340cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* which side are we lighting? */ 341cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (n_dot_VP < 0.0F) { 34253560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell ACC_SCALE_SCALAR_3V(sum[0], attenuation, light->_MatAmbient[0]); 343b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#if IDX & LIGHT_TWOSIDE 344cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell side = 1; 345cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell correction = -1; 346cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell n_dot_VP = -n_dot_VP; 347b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#else 348b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul continue; 349b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#endif 350cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 351cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell else { 352b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#if IDX & LIGHT_TWOSIDE 353b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul ACC_SCALE_SCALAR_3V( sum[1], attenuation, light->_MatAmbient[1]); 354b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#endif 355cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell side = 0; 356cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell correction = 1; 35722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes } 35822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 359cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell COPY_3V(contrib, light->_MatAmbient[side]); 360cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 361cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* diffuse term */ 362cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ACC_SCALE_SCALAR_3V(contrib, n_dot_VP, light->_MatDiffuse[side]); 363cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 364cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* specular term - cannibalize VP... */ 365cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell { 366cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (ctx->Light.Model.LocalViewer) { 367cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLfloat v[3]; 368cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell COPY_3V(v, vertex); 369cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell NORMALIZE_3FV(v); 370cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell SUB_3V(VP, VP, v); /* h = VP + VPe */ 371cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell h = VP; 372cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell NORMALIZE_3FV(h); 373cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 374cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell else if (light->_Flags & LIGHT_POSITIONAL) { 375cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell h = VP; 376cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ACC_3V(h, ctx->_EyeZDir); 377cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell NORMALIZE_3FV(h); 378cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 379cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell else { 380cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell h = light->_h_inf_norm; 381cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 38222144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 383cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell n_dot_h = correction * DOT3(normal, h); 384cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 3859d9111108eadd65708899284b1cfa9ca425f3ac8Brian Paul if (n_dot_h > 0.0F) { 386ba1d921bdf7a15fcc4a4e3162ea6fe9810f233d6Mathias Fröhlich GLfloat spec_coef = lookup_shininess(ctx, side, n_dot_h); 387cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ACC_SCALE_SCALAR_3V( contrib, spec_coef, 388cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell light->_MatSpecular[side]); 389cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 390cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 39153560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell 39253560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell ACC_SCALE_SCALAR_3V( sum[side], attenuation, contrib ); 39353560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell } 39453560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell 395ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell COPY_3V( Fcolor[j], sum[0] ); 39653560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell Fcolor[j][3] = sumA[0]; 39753560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell 398b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#if IDX & LIGHT_TWOSIDE 399b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul COPY_3V( Bcolor[j], sum[1] ); 400b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul Bcolor[j][3] = sumA[1]; 401b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#endif 40222144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes } 403cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 404cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 405cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 406cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 407cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 408cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell/* As below, but with just a single light. 409cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 410f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(light_fast_rgba_single)( struct gl_context *ctx, 411cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct vertex_buffer *VB, 412ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_pipeline_stage *stage, 413cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLvector4f *input ) 414cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 415cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 416cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct light_stage_data *store = LIGHT_STAGE_DATA(stage); 41762e1fae858509615c6e54e0b9388cfa2691a5919Brian Paul const GLuint nstride = VB->AttribPtr[_TNL_ATTRIB_NORMAL]->stride; 41862e1fae858509615c6e54e0b9388cfa2691a5919Brian Paul const GLfloat *normal = (GLfloat *)VB->AttribPtr[_TNL_ATTRIB_NORMAL]->data; 419ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat (*Fcolor)[4] = (GLfloat (*)[4]) store->LitColor[0].data; 420b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#if IDX & LIGHT_TWOSIDE 421ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat (*Bcolor)[4] = (GLfloat (*)[4]) store->LitColor[1].data; 422b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#endif 423cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul const struct gl_light *light = ctx->Light.EnabledList.next; 424cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint j = 0; 4252799d2535ab013ec82c79e3f98f92cdef43dbdf3Jouk Jansen GLfloat base[2][4]; 426dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell#if IDX & LIGHT_MATERIAL 427cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul const GLuint nr = VB->Count; 428dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell#else 42962e1fae858509615c6e54e0b9388cfa2691a5919Brian Paul const GLuint nr = VB->AttribPtr[_TNL_ATTRIB_NORMAL]->count; 430dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell#endif 431cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul 432cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul#ifdef TRACE 433cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul fprintf(stderr, "%s\n", __FUNCTION__ ); 434cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul#endif 435cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 436cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell (void) input; /* doesn't refer to Eye or Obj */ 437cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 4380a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt VB->AttribPtr[_TNL_ATTRIB_COLOR0] = &store->LitColor[0]; 439b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#if IDX & LIGHT_TWOSIDE 4400a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt VB->BackfaceColorPtr = &store->LitColor[1]; 441b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#endif 442cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 443dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell if (nr > 1) { 444dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell store->LitColor[0].stride = 16; 445dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell store->LitColor[1].stride = 16; 446dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell } 447dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell else { 448dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell store->LitColor[0].stride = 0; 449dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell store->LitColor[1].stride = 0; 450dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell } 451dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell 452ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell for (j = 0; j < nr; j++, STRIDE_F(normal,nstride)) { 453cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 454ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat n_dot_VP; 455cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 456462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane#if IDX & LIGHT_MATERIAL 457462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane update_materials( ctx, store ); 458462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane#endif 459cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 46053560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell /* No attenuation, so incoporate _MatAmbient into base color. 46153560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell */ 462462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane#if !(IDX & LIGHT_MATERIAL) 463462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane if ( j == 0 ) 464462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane#endif 465462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane { 466ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell COPY_3V(base[0], light->_MatAmbient[0]); 467ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell ACC_3V(base[0], ctx->Light._BaseColor[0] ); 468ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell base[0][3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]; 46922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 470b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#if IDX & LIGHT_TWOSIDE 471b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul COPY_3V(base[1], light->_MatAmbient[1]); 472b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul ACC_3V(base[1], ctx->Light._BaseColor[1]); 473b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul base[1][3] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]; 474b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#endif 475cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 476cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 477ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell n_dot_VP = DOT3(normal, light->_VP_inf_norm); 47822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes 479ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell if (n_dot_VP < 0.0F) { 480b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#if IDX & LIGHT_TWOSIDE 481b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul GLfloat n_dot_h = -DOT3(normal, light->_h_inf_norm); 482b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul GLfloat sum[3]; 483b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul COPY_3V(sum, base[1]); 484b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul ACC_SCALE_SCALAR_3V(sum, -n_dot_VP, light->_MatDiffuse[1]); 485b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul if (n_dot_h > 0.0F) { 486ba1d921bdf7a15fcc4a4e3162ea6fe9810f233d6Mathias Fröhlich GLfloat spec = lookup_shininess(ctx, 1, n_dot_h); 487b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul ACC_SCALE_SCALAR_3V(sum, spec, light->_MatSpecular[1]); 488b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul } 489b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul COPY_3V(Bcolor[j], sum ); 490b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul Bcolor[j][3] = base[1][3]; 491b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#endif 492ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell COPY_4FV(Fcolor[j], base[0]); 493cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 494ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell else { 495ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat n_dot_h = DOT3(normal, light->_h_inf_norm); 496ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat sum[3]; 497ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell COPY_3V(sum, base[0]); 498ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell ACC_SCALE_SCALAR_3V(sum, n_dot_VP, light->_MatDiffuse[0]); 499ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell if (n_dot_h > 0.0F) { 500ba1d921bdf7a15fcc4a4e3162ea6fe9810f233d6Mathias Fröhlich GLfloat spec = lookup_shininess(ctx, 0, n_dot_h); 501ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell ACC_SCALE_SCALAR_3V(sum, spec, light->_MatSpecular[0]); 502ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell } 503ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell COPY_3V(Fcolor[j], sum ); 504ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell Fcolor[j][3] = base[0][3]; 505b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#if IDX & LIGHT_TWOSIDE 506b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul COPY_4FV(Bcolor[j], base[1]); 507b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#endif 508ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell } 509ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell } 51022144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes} 511cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 512cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 513cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell/* Light infinite lights 514cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 515f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(light_fast_rgba)( struct gl_context *ctx, 516cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct vertex_buffer *VB, 517ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell struct tnl_pipeline_stage *stage, 518cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLvector4f *input ) 519cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 520cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell struct light_stage_data *store = LIGHT_STAGE_DATA(stage); 521ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat sumA[2]; 52262e1fae858509615c6e54e0b9388cfa2691a5919Brian Paul const GLuint nstride = VB->AttribPtr[_TNL_ATTRIB_NORMAL]->stride; 52362e1fae858509615c6e54e0b9388cfa2691a5919Brian Paul const GLfloat *normal = (GLfloat *)VB->AttribPtr[_TNL_ATTRIB_NORMAL]->data; 524ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat (*Fcolor)[4] = (GLfloat (*)[4]) store->LitColor[0].data; 525b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#if IDX & LIGHT_TWOSIDE 526ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat (*Bcolor)[4] = (GLfloat (*)[4]) store->LitColor[1].data; 527b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#endif 528cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLuint j = 0; 529dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell#if IDX & LIGHT_MATERIAL 530cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul const GLuint nr = VB->Count; 531dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell#else 53262e1fae858509615c6e54e0b9388cfa2691a5919Brian Paul const GLuint nr = VB->AttribPtr[_TNL_ATTRIB_NORMAL]->count; 533dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell#endif 534cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul const struct gl_light *light; 535cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul 536cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul#ifdef TRACE 537ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell fprintf(stderr, "%s %d\n", __FUNCTION__, nr ); 538cab83b8aa9e8269ad9c6f905e1bc850689b8ef5cBrian Paul#endif 539cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 540cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell (void) input; 541cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 542ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell sumA[0] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]; 543ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell sumA[1] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]; 544cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 5450a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt VB->AttribPtr[_TNL_ATTRIB_COLOR0] = &store->LitColor[0]; 546b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#if IDX & LIGHT_TWOSIDE 5470a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt VB->BackfaceColorPtr = &store->LitColor[1]; 548b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#endif 549cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 550dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell if (nr > 1) { 551dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell store->LitColor[0].stride = 16; 552dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell store->LitColor[1].stride = 16; 553dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell } 554dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell else { 555dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell store->LitColor[0].stride = 0; 556dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell store->LitColor[1].stride = 0; 557dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell } 558dd9666bc1def9e99a5050545ab71d24037cf5af0Keith Whitwell 559ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell for (j = 0; j < nr; j++, STRIDE_F(normal,nstride)) { 56053560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell 561ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat sum[2][3]; 56246b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell 563462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane#if IDX & LIGHT_MATERIAL 564462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane update_materials( ctx, store ); 56546b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell 566462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane sumA[0] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]; 567b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#if IDX & LIGHT_TWOSIDE 568462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane sumA[1] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]; 569462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane#endif 570b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#endif 57146b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell 572c618005dcff0d4011a77cfebd109880eb784d581Keith Whitwell 573ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell COPY_3V(sum[0], ctx->Light._BaseColor[0]); 574b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#if IDX & LIGHT_TWOSIDE 575b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul COPY_3V(sum[1], ctx->Light._BaseColor[1]); 576b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#endif 577cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 578ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell foreach (light, &ctx->Light.EnabledList) { 579ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell GLfloat n_dot_h, n_dot_VP, spec; 580cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 581ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell ACC_3V(sum[0], light->_MatAmbient[0]); 582b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#if IDX & LIGHT_TWOSIDE 583b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul ACC_3V(sum[1], light->_MatAmbient[1]); 584b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#endif 585cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 586ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell n_dot_VP = DOT3(normal, light->_VP_inf_norm); 587cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 588ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell if (n_dot_VP > 0.0F) { 589ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell ACC_SCALE_SCALAR_3V(sum[0], n_dot_VP, light->_MatDiffuse[0]); 590ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell n_dot_h = DOT3(normal, light->_h_inf_norm); 591ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell if (n_dot_h > 0.0F) { 592ba1d921bdf7a15fcc4a4e3162ea6fe9810f233d6Mathias Fröhlich spec = lookup_shininess(ctx, 0, n_dot_h); 593ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell ACC_SCALE_SCALAR_3V( sum[0], spec, light->_MatSpecular[0]); 594cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 595cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 596b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#if IDX & LIGHT_TWOSIDE 597b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul else { 598ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell ACC_SCALE_SCALAR_3V(sum[1], -n_dot_VP, light->_MatDiffuse[1]); 599ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell n_dot_h = -DOT3(normal, light->_h_inf_norm); 600ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell if (n_dot_h > 0.0F) { 601ba1d921bdf7a15fcc4a4e3162ea6fe9810f233d6Mathias Fröhlich spec = lookup_shininess(ctx, 1, n_dot_h); 602ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell ACC_SCALE_SCALAR_3V( sum[1], spec, light->_MatSpecular[1]); 603ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell } 60453560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell } 605b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#endif 606ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell } 60753560311294814ae0daa8457307a2b25077bf4e9Keith Whitwell 608ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell COPY_3V( Fcolor[j], sum[0] ); 609ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell Fcolor[j][3] = sumA[0]; 610cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 611b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#if IDX & LIGHT_TWOSIDE 612b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul COPY_3V( Bcolor[j], sum[1] ); 613b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul Bcolor[j][3] = sumA[1]; 614b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul#endif 615ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell } 61622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes} 617cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 618cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 619cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 620cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 621cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic void TAG(init_light_tab)( void ) 622cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 623cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _tnl_light_tab[IDX] = TAG(light_rgba); 624cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _tnl_light_fast_tab[IDX] = TAG(light_fast_rgba); 625cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _tnl_light_fast_single_tab[IDX] = TAG(light_fast_rgba_single); 626cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _tnl_light_spec_tab[IDX] = TAG(light_rgba_spec); 627cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 628cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 629cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 630cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#undef TAG 63122144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes#undef IDX 632cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#undef NR_SIDES 633