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