X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Ftnl%2Ft_vb_lighttmp.h;h=124ca3c74fe258b21616263979db681910ffc267;hb=9b70c33e735ff060ddad7d0b501d19c670f41618;hp=ff3dead13ef7ffa42cae867980039daeca826721;hpb=46af1f87c897ef03470d205e9fd147e93911cbce;p=mesa.git diff --git a/src/mesa/tnl/t_vb_lighttmp.h b/src/mesa/tnl/t_vb_lighttmp.h index ff3dead13ef..124ca3c74fe 100644 --- a/src/mesa/tnl/t_vb_lighttmp.h +++ b/src/mesa/tnl/t_vb_lighttmp.h @@ -1,10 +1,8 @@ -/* $Id: t_vb_lighttmp.h,v 1.14 2001/07/28 19:28:49 keithw Exp $ */ - /* * Mesa 3-D graphics library - * Version: 3.5 + * Version: 5.1 * - * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2003 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -25,153 +23,88 @@ * * * Authors: - * Brian Paul - * Keith Whitwell + * Brian Paul + * Keith Whitwell */ -#if (IDX & LIGHT_FLAGS) -# define VSTRIDE (4 * sizeof(GLfloat)) -# define NSTRIDE (3 * sizeof(GLfloat)) -# define CHECK_MATERIAL(x) (flags[x] & VERT_MATERIAL) -# define CHECK_END_VB(x) (flags[x] & VERT_END_VB) -# if (IDX & LIGHT_COLORMATERIAL) -# define CMSTRIDE STRIDE_F(CMcolor, (4 * sizeof(GLfloat))) -# define CHECK_COLOR_MATERIAL(x) (flags[x] & VERT_RGBA) -# define CHECK_VALIDATE(x) (flags[x] & (VERT_RGBA|VERT_MATERIAL)) -# define DO_ANOTHER_NORMAL(x) \ - ((flags[x] & (VERT_RGBA|VERT_NORM|VERT_END_VB|VERT_MATERIAL)) == VERT_NORM) -# define REUSE_LIGHT_RESULTS(x) \ - ((flags[x] & (VERT_RGBA|VERT_NORM|VERT_END_VB|VERT_MATERIAL)) == 0) -# else -# define CMSTRIDE (void)0 -# define CHECK_COLOR_MATERIAL(x) 0 -# define CHECK_VALIDATE(x) (flags[x] & (VERT_MATERIAL)) -# define DO_ANOTHER_NORMAL(x) \ - ((flags[x] & (VERT_NORM|VERT_END_VB|VERT_MATERIAL)) == VERT_NORM) -# define REUSE_LIGHT_RESULTS(x) \ - ((flags[x] & (VERT_NORM|VERT_END_VB|VERT_MATERIAL)) == 0) -# endif -#else -# define VSTRIDE vstride -# define NSTRIDE nstride -# define CHECK_MATERIAL(x) 0 /* no materials on array paths */ -# define CHECK_END_VB(XX) (XX >= nr) -# if (IDX & LIGHT_COLORMATERIAL) -# define CMSTRIDE STRIDE_F(CMcolor, CMstride) -# define CHECK_COLOR_MATERIAL(x) (x < nr) /* always have colormaterial */ -# define CHECK_VALIDATE(x) (x < nr) -# define DO_ANOTHER_NORMAL(x) 0 /* always stop to recalc colormat */ -# else -# define CMSTRIDE (void)0 -# define CHECK_COLOR_MATERIAL(x) 0 /* no colormaterial */ -# define CHECK_VALIDATE(x) (0) -# define DO_ANOTHER_NORMAL(XX) (XX < nr) /* keep going to end of vb */ -# endif -# define REUSE_LIGHT_RESULTS(x) 0 /* always have a new normal */ -#endif - - - -#if (IDX & LIGHT_TWOSIDE) +#if IDX & LIGHT_TWOSIDE # define NR_SIDES 2 #else # define NR_SIDES 1 #endif +/* define TRACE to trace lighting code */ +/* #define TRACE 1 */ +/* + * ctx is the current context + * VB is the vertex buffer + * stage is the lighting stage-private data + * input is the vector of eye or object-space vertex coordinates + */ static void TAG(light_rgba_spec)( GLcontext *ctx, struct vertex_buffer *VB, - struct gl_pipeline_stage *stage, + struct tnl_pipeline_stage *stage, GLvector4f *input ) { struct light_stage_data *store = LIGHT_STAGE_DATA(stage); GLfloat (*base)[3] = ctx->Light._BaseColor; - GLchan sumA[2]; - + GLfloat sumA[2]; GLuint j; - GLuint vstride = input->stride; + const GLuint vstride = input->stride; const GLfloat *vertex = (GLfloat *)input->data; - GLuint nstride = VB->NormalPtr->stride; - const GLfloat *normal = (GLfloat *)VB->NormalPtr->data; - - GLfloat *CMcolor; - GLuint CMstride; - - GLchan (*Fcolor)[4] = (GLchan (*)[4]) store->LitColor[0].Ptr; - GLchan (*Bcolor)[4] = (GLchan (*)[4]) store->LitColor[1].Ptr; - GLchan (*Fspec)[4] = (GLchan (*)[4]) store->LitSecondary[0].Ptr; - GLchan (*Bspec)[4] = (GLchan (*)[4]) store->LitSecondary[1].Ptr; - GLchan (*spec[2])[4]; - - GLuint nr = VB->Count; - GLuint *flags = VB->Flag; - struct gl_material (*new_material)[2] = VB->Material; - GLuint *new_material_mask = VB->MaterialMask; - - (void) flags; - (void) nstride; - (void) vstride; - - - -/* fprintf(stderr, "%s\n", __FUNCTION__ ); */ - - spec[0] = Fspec; - spec[1] = Bspec; + const GLuint nstride = VB->AttribPtr[_TNL_ATTRIB_NORMAL]->stride; + const GLfloat *normal = (GLfloat *)VB->AttribPtr[_TNL_ATTRIB_NORMAL]->data; + + GLfloat (*Fcolor)[4] = (GLfloat (*)[4]) store->LitColor[0].data; + GLfloat (*Fspec)[4] = (GLfloat (*)[4]) store->LitSecondary[0].data; +#if IDX & LIGHT_TWOSIDE + GLfloat (*Bcolor)[4] = (GLfloat (*)[4]) store->LitColor[1].data; + GLfloat (*Bspec)[4] = (GLfloat (*)[4]) store->LitSecondary[1].data; +#endif - if (IDX & LIGHT_COLORMATERIAL) { - if (VB->ColorPtr[0]->Type != GL_FLOAT) - import_color_material( ctx, stage ); + const GLuint nr = VB->Count; - CMcolor = (GLfloat *) VB->ColorPtr[0]->Ptr; - CMstride = VB->ColorPtr[0]->StrideB; - } +#ifdef TRACE + fprintf(stderr, "%s\n", __FUNCTION__ ); +#endif VB->ColorPtr[0] = &store->LitColor[0]; VB->SecondaryColorPtr[0] = &store->LitSecondary[0]; - UNCLAMPED_FLOAT_TO_CHAN(sumA[0], ctx->Light.Material[0].Diffuse[3]); + sumA[0] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]; + +#if IDX & LIGHT_TWOSIDE + VB->ColorPtr[1] = &store->LitColor[1]; + VB->SecondaryColorPtr[1] = &store->LitSecondary[1]; + sumA[1] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]; +#endif - if (IDX & LIGHT_TWOSIDE) { - VB->ColorPtr[1] = &store->LitColor[1]; - VB->SecondaryColorPtr[1] = &store->LitSecondary[1]; - UNCLAMPED_FLOAT_TO_CHAN(sumA[1], ctx->Light.Material[1].Diffuse[3]); - } - /* Side-effects done, can we finish now? - */ - if (stage->changed_inputs == 0) - return; + store->LitColor[0].stride = 16; + store->LitColor[1].stride = 16; - for ( j=0 ; - jLight.Material[0].Diffuse[3]); - if (IDX & LIGHT_TWOSIDE) - UNCLAMPED_FLOAT_TO_CHAN(sumA[1], ctx->Light.Material[1].Diffuse[3]); - } +#if IDX & LIGHT_MATERIAL + update_materials( ctx, store ); + sumA[0] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]; +#if IDX & LIGHT_TWOSIDE + sumA[1] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]; +#endif +#endif COPY_3V(sum[0], base[0]); ZERO_3V(spec[0]); - if (IDX & LIGHT_TWOSIDE) { - COPY_3V(sum[1], base[1]); - ZERO_3V(spec[1]); - } +#if IDX & LIGHT_TWOSIDE + COPY_3V(sum[1], base[1]); + ZERO_3V(spec[1]); +#endif /* Add contribution from each enabled light source */ foreach (light, &ctx->Light.EnabledList) { @@ -208,22 +141,21 @@ static void TAG(light_rgba_spec)( GLcontext *ctx, /* spotlight attenuation */ if (light->_Flags & LIGHT_SPOT) { - GLfloat PV_dot_dir = - DOT3(VP, light->_NormDirection); + GLfloat PV_dot_dir = - DOT3(VP, light->_NormSpotDirection); if (PV_dot_dir_CosCutoff) { continue; /* this light makes no contribution */ } else { - double x = PV_dot_dir * (EXP_TABLE_SIZE-1); - int k = (int) x; + GLdouble x = PV_dot_dir * (EXP_TABLE_SIZE-1); + GLint k = (GLint) x; GLfloat spot = (GLfloat) (light->_SpotExpTable[k][0] - + (x-k)*light->_SpotExpTable[k][1]); + + (x-k)*light->_SpotExpTable[k][1]); attenuation *= spot; } } } - if (attenuation < 1e-3) continue; /* this light makes no contribution */ @@ -233,17 +165,18 @@ static void TAG(light_rgba_spec)( GLcontext *ctx, /* Which side gets the diffuse & specular terms? */ if (n_dot_VP < 0.0F) { ACC_SCALE_SCALAR_3V(sum[0], attenuation, light->_MatAmbient[0]); - if (!(IDX & LIGHT_TWOSIDE)) { - continue; - } +#if IDX & LIGHT_TWOSIDE side = 1; correction = -1; n_dot_VP = -n_dot_VP; +#else + continue; +#endif } else { - if (IDX & LIGHT_TWOSIDE) { - ACC_SCALE_SCALAR_3V( sum[1], attenuation, light->_MatAmbient[1]); - } +#if IDX & LIGHT_TWOSIDE + ACC_SCALE_SCALAR_3V( sum[1], attenuation, light->_MatAmbient[1]); +#endif side = 0; correction = 1; } @@ -286,98 +219,74 @@ static void TAG(light_rgba_spec)( GLcontext *ctx, } } /*loop over lights*/ - UNCLAMPED_FLOAT_TO_RGB_CHAN( Fcolor[j], sum[0] ); - UNCLAMPED_FLOAT_TO_RGB_CHAN( Fspec[j], spec[0] ); + COPY_3V( Fcolor[j], sum[0] ); + COPY_3V( Fspec[j], spec[0] ); Fcolor[j][3] = sumA[0]; - if (IDX & LIGHT_TWOSIDE) { - UNCLAMPED_FLOAT_TO_RGB_CHAN( Bcolor[j], sum[1] ); - UNCLAMPED_FLOAT_TO_RGB_CHAN( Bspec[j], spec[1] ); - Bcolor[j][3] = sumA[1]; - } +#if IDX & LIGHT_TWOSIDE + COPY_3V( Bcolor[j], sum[1] ); + COPY_3V( Bspec[j], spec[1] ); + Bcolor[j][3] = sumA[1]; +#endif } } static void TAG(light_rgba)( GLcontext *ctx, struct vertex_buffer *VB, - struct gl_pipeline_stage *stage, + struct tnl_pipeline_stage *stage, GLvector4f *input ) { struct light_stage_data *store = LIGHT_STAGE_DATA(stage); GLuint j; GLfloat (*base)[3] = ctx->Light._BaseColor; - GLchan sumA[2]; + GLfloat sumA[2]; - GLuint vstride = input->stride; + const GLuint vstride = input->stride; const GLfloat *vertex = (GLfloat *) input->data; - GLuint nstride = VB->NormalPtr->stride; - const GLfloat *normal = (GLfloat *)VB->NormalPtr->data; - - GLfloat *CMcolor; - GLuint CMstride; - - GLchan (*Fcolor)[4] = (GLchan (*)[4]) store->LitColor[0].Ptr; - GLchan (*Bcolor)[4] = (GLchan (*)[4]) store->LitColor[1].Ptr; - GLchan (*color[2])[4]; - GLuint *flags = VB->Flag; - - struct gl_material (*new_material)[2] = VB->Material; - GLuint *new_material_mask = VB->MaterialMask; - GLuint nr = VB->Count; + const GLuint nstride = VB->AttribPtr[_TNL_ATTRIB_NORMAL]->stride; + const GLfloat *normal = (GLfloat *)VB->AttribPtr[_TNL_ATTRIB_NORMAL]->data; -/* fprintf(stderr, "%s\n", __FUNCTION__ ); */ - (void) flags; - (void) nstride; - (void) vstride; - - color[0] = Fcolor; - color[1] = Bcolor; + GLfloat (*Fcolor)[4] = (GLfloat (*)[4]) store->LitColor[0].data; +#if IDX & LIGHT_TWOSIDE + GLfloat (*Bcolor)[4] = (GLfloat (*)[4]) store->LitColor[1].data; +#endif - if (IDX & LIGHT_COLORMATERIAL) { - if (VB->ColorPtr[0]->Type != GL_FLOAT) - import_color_material( ctx, stage ); + const GLuint nr = VB->Count; - CMcolor = (GLfloat *)VB->ColorPtr[0]->Ptr; - CMstride = VB->ColorPtr[0]->StrideB; - } +#ifdef TRACE + fprintf(stderr, "%s\n", __FUNCTION__ ); +#endif VB->ColorPtr[0] = &store->LitColor[0]; - UNCLAMPED_FLOAT_TO_CHAN(sumA[0], ctx->Light.Material[0].Diffuse[3]); + sumA[0] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]; - if (IDX & LIGHT_TWOSIDE) { - VB->ColorPtr[1] = &store->LitColor[1]; - UNCLAMPED_FLOAT_TO_CHAN(sumA[1], ctx->Light.Material[1].Diffuse[3]); - } +#if IDX & LIGHT_TWOSIDE + VB->ColorPtr[1] = &store->LitColor[1]; + sumA[1] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]; +#endif - if (stage->changed_inputs == 0) - return; + store->LitColor[0].stride = 16; + store->LitColor[1].stride = 16; - for ( j=0 ; - jLight.Material[0].Diffuse[3]); - if (IDX & LIGHT_TWOSIDE) - UNCLAMPED_FLOAT_TO_CHAN(sumA[1], ctx->Light.Material[1].Diffuse[3]); - } +#if IDX & LIGHT_MATERIAL + update_materials( ctx, store ); + sumA[0] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]; +#if IDX & LIGHT_TWOSIDE + sumA[1] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]; +#endif +#endif COPY_3V(sum[0], base[0]); - if ( IDX & LIGHT_TWOSIDE ) - COPY_3V(sum[1], base[1]); +#if IDX & LIGHT_TWOSIDE + COPY_3V(sum[1], base[1]); +#endif /* Add contribution from each enabled light source */ foreach (light, &ctx->Light.EnabledList) { @@ -403,7 +312,7 @@ static void TAG(light_rgba)( GLcontext *ctx, SUB_3V(VP, light->_Position, vertex); - d = LEN_3FV( VP ); + d = (GLfloat) LEN_3FV( VP ); if ( d > 1e-6) { GLfloat invd = 1.0F / d; @@ -416,44 +325,42 @@ static void TAG(light_rgba)( GLcontext *ctx, /* spotlight attenuation */ if (light->_Flags & LIGHT_SPOT) { - GLfloat PV_dot_dir = - DOT3(VP, light->_NormDirection); + GLfloat PV_dot_dir = - DOT3(VP, light->_NormSpotDirection); if (PV_dot_dir_CosCutoff) { continue; /* this light makes no contribution */ } else { - double x = PV_dot_dir * (EXP_TABLE_SIZE-1); - int k = (int) x; - GLfloat spot = (light->_SpotExpTable[k][0] + GLdouble x = PV_dot_dir * (EXP_TABLE_SIZE-1); + GLint k = (GLint) x; + GLfloat spot = (GLfloat) (light->_SpotExpTable[k][0] + (x-k)*light->_SpotExpTable[k][1]); attenuation *= spot; } } } - if (attenuation < 1e-3) continue; /* this light makes no contribution */ - /* Compute dot product or normal and vector from V to light pos */ n_dot_VP = DOT3( normal, VP ); /* which side are we lighting? */ if (n_dot_VP < 0.0F) { ACC_SCALE_SCALAR_3V(sum[0], attenuation, light->_MatAmbient[0]); - - if (!(IDX & LIGHT_TWOSIDE)) - continue; - +#if IDX & LIGHT_TWOSIDE side = 1; correction = -1; n_dot_VP = -n_dot_VP; +#else + continue; +#endif } else { - if (IDX & LIGHT_TWOSIDE) { - ACC_SCALE_SCALAR_3V( sum[1], attenuation, light->_MatAmbient[1]); - } +#if IDX & LIGHT_TWOSIDE + ACC_SCALE_SCALAR_3V( sum[1], attenuation, light->_MatAmbient[1]); +#endif side = 0; correction = 1; } @@ -499,13 +406,13 @@ static void TAG(light_rgba)( GLcontext *ctx, ACC_SCALE_SCALAR_3V( sum[side], attenuation, contrib ); } - UNCLAMPED_FLOAT_TO_RGB_CHAN( Fcolor[j], sum[0] ); + COPY_3V( Fcolor[j], sum[0] ); Fcolor[j][3] = sumA[0]; - if (IDX & LIGHT_TWOSIDE) { - UNCLAMPED_FLOAT_TO_RGB_CHAN( Bcolor[j], sum[1] ); - Bcolor[j][3] = sumA[1]; - } +#if IDX & LIGHT_TWOSIDE + COPY_3V( Bcolor[j], sum[1] ); + Bcolor[j][3] = sumA[1]; +#endif } } @@ -516,122 +423,107 @@ static void TAG(light_rgba)( GLcontext *ctx, */ static void TAG(light_fast_rgba_single)( GLcontext *ctx, struct vertex_buffer *VB, - struct gl_pipeline_stage *stage, + struct tnl_pipeline_stage *stage, GLvector4f *input ) { struct light_stage_data *store = LIGHT_STAGE_DATA(stage); - GLuint nstride = VB->NormalPtr->stride; - const GLfloat *normal = (GLfloat *)VB->NormalPtr->data; - GLfloat *CMcolor; - GLuint CMstride; - GLchan (*Fcolor)[4] = (GLchan (*)[4]) store->LitColor[0].Ptr; - GLchan (*Bcolor)[4] = (GLchan (*)[4]) store->LitColor[1].Ptr; - struct gl_light *light = ctx->Light.EnabledList.next; - GLuint *flags = VB->Flag; - GLchan basechan[2][4]; + const GLuint nstride = VB->AttribPtr[_TNL_ATTRIB_NORMAL]->stride; + const GLfloat *normal = (GLfloat *)VB->AttribPtr[_TNL_ATTRIB_NORMAL]->data; + GLfloat (*Fcolor)[4] = (GLfloat (*)[4]) store->LitColor[0].data; +#if IDX & LIGHT_TWOSIDE + GLfloat (*Bcolor)[4] = (GLfloat (*)[4]) store->LitColor[1].data; +#endif + const struct gl_light *light = ctx->Light.EnabledList.next; GLuint j = 0; - struct gl_material (*new_material)[2] = VB->Material; - GLuint *new_material_mask = VB->MaterialMask; - GLfloat base[2][3]; - GLuint nr = VB->Count; - -/* fprintf(stderr, "%s\n", __FUNCTION__ ); */ - (void) input; /* doesn't refer to Eye or Obj */ - (void) flags; - (void) nr; - (void) nstride; + GLfloat base[2][4]; +#if IDX & LIGHT_MATERIAL + const GLuint nr = VB->Count; +#else + const GLuint nr = VB->AttribPtr[_TNL_ATTRIB_NORMAL]->count; +#endif - if (IDX & LIGHT_COLORMATERIAL) { - if (VB->ColorPtr[0]->Type != GL_FLOAT) - import_color_material( ctx, stage ); +#ifdef TRACE + fprintf(stderr, "%s\n", __FUNCTION__ ); +#endif - CMcolor = (GLfloat *)VB->ColorPtr[0]->Ptr; - CMstride = VB->ColorPtr[0]->StrideB; - } + (void) input; /* doesn't refer to Eye or Obj */ VB->ColorPtr[0] = &store->LitColor[0]; - if (IDX & LIGHT_TWOSIDE) - VB->ColorPtr[1] = &store->LitColor[1]; - - if (stage->changed_inputs == 0) - return; +#if IDX & LIGHT_TWOSIDE + VB->ColorPtr[1] = &store->LitColor[1]; +#endif - do { - - if ( CHECK_COLOR_MATERIAL(j) ) - _mesa_update_color_material( ctx, CMcolor ); + if (nr > 1) { + store->LitColor[0].stride = 16; + store->LitColor[1].stride = 16; + } + else { + store->LitColor[0].stride = 0; + store->LitColor[1].stride = 0; + } - if ( CHECK_MATERIAL(j) ) - _mesa_update_material( ctx, new_material[j], new_material_mask[j] ); + for (j = 0; j < nr; j++, STRIDE_F(normal,nstride)) { - if ( CHECK_VALIDATE(j) ) - _mesa_validate_all_lighting_tables( ctx ); + GLfloat n_dot_VP; +#if IDX & LIGHT_MATERIAL + update_materials( ctx, store ); +#endif /* No attenuation, so incoporate _MatAmbient into base color. */ - COPY_3V(base[0], light->_MatAmbient[0]); - ACC_3V(base[0], ctx->Light._BaseColor[0] ); - UNCLAMPED_FLOAT_TO_RGB_CHAN( basechan[0], base[0] ); - UNCLAMPED_FLOAT_TO_CHAN(basechan[0][3], - ctx->Light.Material[0].Diffuse[3]); - - if (IDX & LIGHT_TWOSIDE) { - COPY_3V(base[1], light->_MatAmbient[1]); - ACC_3V(base[1], ctx->Light._BaseColor[1]); - UNCLAMPED_FLOAT_TO_RGB_CHAN( basechan[1], base[1]); - UNCLAMPED_FLOAT_TO_CHAN(basechan[1][3], - ctx->Light.Material[1].Diffuse[3]); +#if !(IDX & LIGHT_MATERIAL) + if ( j == 0 ) +#endif + { + COPY_3V(base[0], light->_MatAmbient[0]); + ACC_3V(base[0], ctx->Light._BaseColor[0] ); + base[0][3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]; + +#if IDX & LIGHT_TWOSIDE + COPY_3V(base[1], light->_MatAmbient[1]); + ACC_3V(base[1], ctx->Light._BaseColor[1]); + base[1][3] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]; +#endif } - do { - GLfloat n_dot_VP = DOT3(normal, light->_VP_inf_norm); - - - if (n_dot_VP < 0.0F) { - if (IDX & LIGHT_TWOSIDE) { - GLfloat n_dot_h = -DOT3(normal, light->_h_inf_norm); - GLfloat sum[3]; - COPY_3V(sum, base[1]); - ACC_SCALE_SCALAR_3V(sum, -n_dot_VP, light->_MatDiffuse[1]); - if (n_dot_h > 0.0F) { - GLfloat spec; - GET_SHINE_TAB_ENTRY( ctx->_ShineTable[1], n_dot_h, spec ); - ACC_SCALE_SCALAR_3V(sum, spec, light->_MatSpecular[1]); - } - UNCLAMPED_FLOAT_TO_RGB_CHAN(Bcolor[j], sum ); - } - COPY_CHAN4(Fcolor[j], basechan[0]); - } else { - GLfloat n_dot_h = DOT3(normal, light->_h_inf_norm); - GLfloat sum[3]; - COPY_3V(sum, base[0]); - ACC_SCALE_SCALAR_3V(sum, n_dot_VP, light->_MatDiffuse[0]); - if (n_dot_h > 0.0F) { - GLfloat spec; - GET_SHINE_TAB_ENTRY( ctx->_ShineTable[0], n_dot_h, spec ); - ACC_SCALE_SCALAR_3V(sum, spec, light->_MatSpecular[0]); + n_dot_VP = DOT3(normal, light->_VP_inf_norm); + + if (n_dot_VP < 0.0F) { +#if IDX & LIGHT_TWOSIDE + GLfloat n_dot_h = -DOT3(normal, light->_h_inf_norm); + GLfloat sum[3]; + COPY_3V(sum, base[1]); + ACC_SCALE_SCALAR_3V(sum, -n_dot_VP, light->_MatDiffuse[1]); + if (n_dot_h > 0.0F) { + GLfloat spec; + GET_SHINE_TAB_ENTRY( ctx->_ShineTable[1], n_dot_h, spec ); + ACC_SCALE_SCALAR_3V(sum, spec, light->_MatSpecular[1]); + } + COPY_3V(Bcolor[j], sum ); + Bcolor[j][3] = base[1][3]; +#endif + COPY_4FV(Fcolor[j], base[0]); + } + else { + GLfloat n_dot_h = DOT3(normal, light->_h_inf_norm); + GLfloat sum[3]; + COPY_3V(sum, base[0]); + ACC_SCALE_SCALAR_3V(sum, n_dot_VP, light->_MatDiffuse[0]); + if (n_dot_h > 0.0F) { + GLfloat spec; + GET_SHINE_TAB_ENTRY( ctx->_ShineTable[0], n_dot_h, spec ); + ACC_SCALE_SCALAR_3V(sum, spec, light->_MatSpecular[0]); - } - UNCLAMPED_FLOAT_TO_RGB_CHAN(Fcolor[j], sum ); - if (IDX & LIGHT_TWOSIDE) COPY_CHAN4(Bcolor[j], basechan[1]); } - - j++; - CMSTRIDE; - STRIDE_F(normal, NSTRIDE); - } while (DO_ANOTHER_NORMAL(j)); - - - for ( ; REUSE_LIGHT_RESULTS(j) ; j++, CMSTRIDE, STRIDE_F(normal,NSTRIDE)) - { - COPY_CHAN4(Fcolor[j], Fcolor[j-1]); - if (IDX & LIGHT_TWOSIDE) - COPY_CHAN4(Bcolor[j], Bcolor[j-1]); + COPY_3V(Fcolor[j], sum ); + Fcolor[j][3] = base[0][3]; +#if IDX & LIGHT_TWOSIDE + COPY_4FV(Bcolor[j], base[1]); +#endif } - - } while (!CHECK_END_VB(j)); + } } @@ -639,125 +531,107 @@ static void TAG(light_fast_rgba_single)( GLcontext *ctx, */ static void TAG(light_fast_rgba)( GLcontext *ctx, struct vertex_buffer *VB, - struct gl_pipeline_stage *stage, + struct tnl_pipeline_stage *stage, GLvector4f *input ) { struct light_stage_data *store = LIGHT_STAGE_DATA(stage); - GLchan sumA[2]; - GLuint nstride = VB->NormalPtr->stride; - const GLfloat *normal = (GLfloat *)VB->NormalPtr->data; - GLfloat *CMcolor; - GLuint CMstride; - GLchan (*Fcolor)[4] = (GLchan (*)[4]) store->LitColor[0].Ptr; - GLchan (*Bcolor)[4] = (GLchan (*)[4]) store->LitColor[1].Ptr; - GLuint *flags = VB->Flag; + GLfloat sumA[2]; + const GLuint nstride = VB->AttribPtr[_TNL_ATTRIB_NORMAL]->stride; + const GLfloat *normal = (GLfloat *)VB->AttribPtr[_TNL_ATTRIB_NORMAL]->data; + GLfloat (*Fcolor)[4] = (GLfloat (*)[4]) store->LitColor[0].data; +#if IDX & LIGHT_TWOSIDE + GLfloat (*Bcolor)[4] = (GLfloat (*)[4]) store->LitColor[1].data; +#endif GLuint j = 0; - struct gl_material (*new_material)[2] = VB->Material; - GLuint *new_material_mask = VB->MaterialMask; - GLuint nr = VB->Count; - struct gl_light *light; +#if IDX & LIGHT_MATERIAL + const GLuint nr = VB->Count; +#else + const GLuint nr = VB->AttribPtr[_TNL_ATTRIB_NORMAL]->count; +#endif + const struct gl_light *light; + +#ifdef TRACE + fprintf(stderr, "%s %d\n", __FUNCTION__, nr ); +#endif -/* fprintf(stderr, "%s\n", __FUNCTION__ ); */ - (void) flags; (void) input; - (void) nr; - (void) nstride; - UNCLAMPED_FLOAT_TO_CHAN(sumA[0], ctx->Light.Material[0].Diffuse[3]); - UNCLAMPED_FLOAT_TO_CHAN(sumA[1], ctx->Light.Material[1].Diffuse[3]); + sumA[0] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]; + sumA[1] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]; - if (IDX & LIGHT_COLORMATERIAL) { - if (VB->ColorPtr[0]->Type != GL_FLOAT) - import_color_material( ctx, stage ); + VB->ColorPtr[0] = &store->LitColor[0]; +#if IDX & LIGHT_TWOSIDE + VB->ColorPtr[1] = &store->LitColor[1]; +#endif - CMcolor = (GLfloat *)VB->ColorPtr[0]->Ptr; - CMstride = VB->ColorPtr[0]->StrideB; + if (nr > 1) { + store->LitColor[0].stride = 16; + store->LitColor[1].stride = 16; + } + else { + store->LitColor[0].stride = 0; + store->LitColor[1].stride = 0; } - VB->ColorPtr[0] = &store->LitColor[0]; - if (IDX & LIGHT_TWOSIDE) - VB->ColorPtr[1] = &store->LitColor[1]; - - if (stage->changed_inputs == 0) - return; + for (j = 0; j < nr; j++, STRIDE_F(normal,nstride)) { - do { - do { - GLfloat sum[2][3]; + GLfloat sum[2][3]; - if ( CHECK_COLOR_MATERIAL(j) ) - _mesa_update_color_material( ctx, CMcolor ); +#if IDX & LIGHT_MATERIAL + update_materials( ctx, store ); - if ( CHECK_MATERIAL(j) ) - _mesa_update_material( ctx, new_material[j], new_material_mask[j] ); + sumA[0] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]; +#if IDX & LIGHT_TWOSIDE + sumA[1] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]; +#endif +#endif - if ( CHECK_VALIDATE(j) ) { - _mesa_validate_all_lighting_tables( ctx ); - UNCLAMPED_FLOAT_TO_CHAN(sumA[0], ctx->Light.Material[0].Diffuse[3]); - if (IDX & LIGHT_TWOSIDE) - UNCLAMPED_FLOAT_TO_CHAN(sumA[1], - ctx->Light.Material[1].Diffuse[3]); - } - COPY_3V(sum[0], ctx->Light._BaseColor[0]); - if (IDX & LIGHT_TWOSIDE) - COPY_3V(sum[1], ctx->Light._BaseColor[1]); + COPY_3V(sum[0], ctx->Light._BaseColor[0]); +#if IDX & LIGHT_TWOSIDE + COPY_3V(sum[1], ctx->Light._BaseColor[1]); +#endif - foreach (light, &ctx->Light.EnabledList) { - GLfloat n_dot_h, n_dot_VP, spec; + foreach (light, &ctx->Light.EnabledList) { + GLfloat n_dot_h, n_dot_VP, spec; - ACC_3V(sum[0], light->_MatAmbient[0]); - if (IDX & LIGHT_TWOSIDE) - ACC_3V(sum[1], light->_MatAmbient[1]); + ACC_3V(sum[0], light->_MatAmbient[0]); +#if IDX & LIGHT_TWOSIDE + ACC_3V(sum[1], light->_MatAmbient[1]); +#endif - n_dot_VP = DOT3(normal, light->_VP_inf_norm); + n_dot_VP = DOT3(normal, light->_VP_inf_norm); - if (n_dot_VP > 0.0F) { - ACC_SCALE_SCALAR_3V(sum[0], n_dot_VP, light->_MatDiffuse[0]); - n_dot_h = DOT3(normal, light->_h_inf_norm); - if (n_dot_h > 0.0F) { - struct gl_shine_tab *tab = ctx->_ShineTable[0]; - GET_SHINE_TAB_ENTRY( tab, n_dot_h, spec ); - ACC_SCALE_SCALAR_3V( sum[0], spec, - light->_MatSpecular[0]); - } - } - else if (IDX & LIGHT_TWOSIDE) { - ACC_SCALE_SCALAR_3V(sum[1], -n_dot_VP, light->_MatDiffuse[1]); - n_dot_h = -DOT3(normal, light->_h_inf_norm); - if (n_dot_h > 0.0F) { - struct gl_shine_tab *tab = ctx->_ShineTable[1]; - GET_SHINE_TAB_ENTRY( tab, n_dot_h, spec ); - ACC_SCALE_SCALAR_3V( sum[1], spec, - light->_MatSpecular[1]); - } + if (n_dot_VP > 0.0F) { + ACC_SCALE_SCALAR_3V(sum[0], n_dot_VP, light->_MatDiffuse[0]); + n_dot_h = DOT3(normal, light->_h_inf_norm); + if (n_dot_h > 0.0F) { + struct gl_shine_tab *tab = ctx->_ShineTable[0]; + GET_SHINE_TAB_ENTRY( tab, n_dot_h, spec ); + ACC_SCALE_SCALAR_3V( sum[0], spec, light->_MatSpecular[0]); } } - - UNCLAMPED_FLOAT_TO_RGB_CHAN( Fcolor[j], sum[0] ); - Fcolor[j][3] = sumA[0]; - - if (IDX & LIGHT_TWOSIDE) { - UNCLAMPED_FLOAT_TO_RGB_CHAN( Bcolor[j], sum[1] ); - Bcolor[j][3] = sumA[1]; +#if IDX & LIGHT_TWOSIDE + else { + ACC_SCALE_SCALAR_3V(sum[1], -n_dot_VP, light->_MatDiffuse[1]); + n_dot_h = -DOT3(normal, light->_h_inf_norm); + if (n_dot_h > 0.0F) { + struct gl_shine_tab *tab = ctx->_ShineTable[1]; + GET_SHINE_TAB_ENTRY( tab, n_dot_h, spec ); + ACC_SCALE_SCALAR_3V( sum[1], spec, light->_MatSpecular[1]); + } } - - j++; - CMSTRIDE; - STRIDE_F(normal, NSTRIDE); - } while (DO_ANOTHER_NORMAL(j)); - - /* Reuse the shading results while there is no change to - * normal or material values. - */ - for ( ; REUSE_LIGHT_RESULTS(j) ; j++, CMSTRIDE, STRIDE_F(normal, NSTRIDE)) - { - COPY_CHAN4(Fcolor[j], Fcolor[j-1]); - if (IDX & LIGHT_TWOSIDE) - COPY_CHAN4(Bcolor[j], Bcolor[j-1]); +#endif } - } while (!CHECK_END_VB(j)); + COPY_3V( Fcolor[j], sum[0] ); + Fcolor[j][3] = sumA[0]; + +#if IDX & LIGHT_TWOSIDE + COPY_3V( Bcolor[j], sum[1] ); + Bcolor[j][3] = sumA[1]; +#endif + } } @@ -775,70 +649,47 @@ static void TAG(light_fast_rgba)( GLcontext *ctx, */ static void TAG(light_ci)( GLcontext *ctx, struct vertex_buffer *VB, - struct gl_pipeline_stage *stage, + struct tnl_pipeline_stage *stage, GLvector4f *input ) { struct light_stage_data *store = LIGHT_STAGE_DATA(stage); GLuint j; - GLuint vstride = input->stride; + const GLuint vstride = input->stride; const GLfloat *vertex = (GLfloat *) input->data; - GLuint nstride = VB->NormalPtr->stride; - const GLfloat *normal = (GLfloat *)VB->NormalPtr->data; - GLfloat *CMcolor; - GLuint CMstride; - GLuint *flags = VB->Flag; - GLuint *indexResult[2]; - struct gl_material (*new_material)[2] = VB->Material; - GLuint *new_material_mask = VB->MaterialMask; - GLuint nr = VB->Count; - -/* fprintf(stderr, "%s\n", __FUNCTION__ ); */ - (void) flags; - (void) nstride; - (void) vstride; + const GLuint nstride = VB->AttribPtr[_TNL_ATTRIB_NORMAL]->stride; + const GLfloat *normal = (GLfloat *)VB->AttribPtr[_TNL_ATTRIB_NORMAL]->data; + GLfloat *indexResult[2]; + const GLuint nr = VB->Count; - VB->IndexPtr[0] = &store->LitIndex[0]; - if (IDX & LIGHT_TWOSIDE) - VB->IndexPtr[1] = &store->LitIndex[1]; - - if (stage->changed_inputs == 0) - return; - - indexResult[0] = VB->IndexPtr[0]->data; - if (IDX & LIGHT_TWOSIDE) - indexResult[1] = VB->IndexPtr[1]->data; +#ifdef TRACE + fprintf(stderr, "%s\n", __FUNCTION__ ); +#endif - if (IDX & LIGHT_COLORMATERIAL) { - if (VB->ColorPtr[0]->Type != GL_FLOAT) - import_color_material( ctx, stage ); + VB->IndexPtr[0] = &store->LitIndex[0]; +#if IDX & LIGHT_TWOSIDE + VB->IndexPtr[1] = &store->LitIndex[1]; +#endif - CMcolor = (GLfloat *)VB->ColorPtr[0]->Ptr; - CMstride = VB->ColorPtr[0]->StrideB; - } + indexResult[0] = (GLfloat *)VB->IndexPtr[0]->data; +#if IDX & LIGHT_TWOSIDE + indexResult[1] = (GLfloat *)VB->IndexPtr[1]->data; +#endif /* loop over vertices */ - for ( j=0 ; - jLight.EnabledList) { @@ -858,7 +709,7 @@ static void TAG(light_ci)( GLcontext *ctx, SUB_3V(VP, light->_Position, vertex); - d = LEN_3FV( VP ); + d = (GLfloat) LEN_3FV( VP ); if ( d > 1e-6) { GLfloat invd = 1.0F / d; SELF_SCALE_SCALAR_3V(VP, invd); @@ -870,14 +721,14 @@ static void TAG(light_ci)( GLcontext *ctx, /* spotlight attenuation */ if (light->_Flags & LIGHT_SPOT) { - GLfloat PV_dot_dir = - DOT3(VP, light->_NormDirection); + GLfloat PV_dot_dir = - DOT3(VP, light->_NormSpotDirection); if (PV_dot_dir < light->_CosCutoff) { continue; /* this light makes no contribution */ } else { - double x = PV_dot_dir * (EXP_TABLE_SIZE-1); - int k = (int) x; - GLfloat spot = (light->_SpotExpTable[k][0] + GLdouble x = PV_dot_dir * (EXP_TABLE_SIZE-1); + GLint k = (GLint) x; + GLfloat spot = (GLfloat) (light->_SpotExpTable[k][0] + (x-k)*light->_SpotExpTable[k][1]); attenuation *= spot; } @@ -891,11 +742,13 @@ static void TAG(light_ci)( GLcontext *ctx, /* which side are we lighting? */ if (n_dot_VP < 0.0F) { - if (!(IDX & LIGHT_TWOSIDE)) - continue; +#if IDX & LIGHT_TWOSIDE side = 1; correction = -1; n_dot_VP = -n_dot_VP; +#else + continue; +#endif } /* accumulate diffuse term */ @@ -933,25 +786,23 @@ static void TAG(light_ci)( GLcontext *ctx, /* Now compute final color index */ for (side = 0 ; side < NR_SIDES ; side++) { - struct gl_material *mat = &ctx->Light.Material[side]; + const GLfloat *ind = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_INDEXES + side]; GLfloat index; if (specular[side] > 1.0F) { - index = mat->SpecularIndex; + index = ind[MAT_INDEX_SPECULAR]; } else { - GLfloat d_a = mat->DiffuseIndex - mat->AmbientIndex; - GLfloat s_a = mat->SpecularIndex - mat->AmbientIndex; - - index = mat->AmbientIndex - + diffuse[side] * (1.0F-specular[side]) * d_a - + specular[side] * s_a; - - if (index > mat->SpecularIndex) { - index = mat->SpecularIndex; + GLfloat d_a = ind[MAT_INDEX_DIFFUSE] - ind[MAT_INDEX_AMBIENT]; + GLfloat s_a = ind[MAT_INDEX_SPECULAR] - ind[MAT_INDEX_AMBIENT]; + index = (ind[MAT_INDEX_AMBIENT] + + diffuse[side] * (1.0F-specular[side]) * d_a + + specular[side] * s_a); + if (index > ind[MAT_INDEX_SPECULAR]) { + index = ind[MAT_INDEX_SPECULAR]; } } - indexResult[side][j] = (GLuint) (GLint) index; + indexResult[side][j] = index; } } /*for vertex*/ } @@ -971,12 +822,3 @@ static void TAG(init_light_tab)( void ) #undef TAG #undef IDX #undef NR_SIDES -#undef NSTRIDE -#undef VSTRIDE -#undef CHECK_MATERIAL -#undef CHECK_END_VB -#undef DO_ANOTHER_NORMAL -#undef REUSE_LIGHT_RESULTS -#undef CMSTRIDE -#undef CHECK_COLOR_MATERIAL -#undef CHECK_VALIDATE