ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

static void TAG() light_rgba ( GLcontext *  ctx,
struct vertex_buffer VB,
struct tnl_pipeline_stage stage,
GLvector4f input 
) [static]

Definition at line 235 of file t_vb_lighttmp.h.

Referenced by init_light_tab().

{
   struct light_stage_data *store = LIGHT_STAGE_DATA(stage);
   GLuint j;

   GLfloat (*base)[3] = ctx->Light._BaseColor;
   GLfloat sumA[2];

   const GLuint vstride = input->stride;
   const GLfloat *vertex = (GLfloat *) input->data;
   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 GLuint nr = VB->Count;

#ifdef TRACE
   fprintf(stderr, "%s\n", __FUNCTION__ );
#endif

   VB->ColorPtr[0] = &store->LitColor[0];
   sumA[0] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3];

#if IDX & LIGHT_TWOSIDE
   VB->ColorPtr[1] = &store->LitColor[1];
   sumA[1] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3];
#endif

   store->LitColor[0].stride = 16;
   store->LitColor[1].stride = 16;

   for (j = 0; j < nr; j++,STRIDE_F(vertex,vstride),STRIDE_F(normal,nstride)) {
      GLfloat sum[2][3];
      struct gl_light *light;

#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]);
#endif

      /* Add contribution from each enabled light source */
      foreach (light, &ctx->Light.EnabledList) {

     GLfloat n_dot_h;
     GLfloat correction;
     GLint side;
     GLfloat contrib[3];
     GLfloat attenuation = 1.0;
     GLfloat VP[3];          /* unit vector from vertex to light */
     GLfloat n_dot_VP;       /* n dot VP */
     GLfloat *h;

     /* compute VP and attenuation */
     if (!(light->_Flags & LIGHT_POSITIONAL)) {
        /* directional light */
        COPY_3V(VP, light->_VP_inf_norm);
        attenuation = light->_VP_inf_spot_attenuation;
     }
     else {
        GLfloat d;     /* distance from vertex to light */


        SUB_3V(VP, light->_Position, vertex);

        d = (GLfloat) LEN_3FV( VP );

        if ( d > 1e-6) {
           GLfloat invd = 1.0F / d;
           SELF_SCALE_SCALAR_3V(VP, invd);
        }

            attenuation = 1.0F / (light->ConstantAttenuation + d *
                                  (light->LinearAttenuation + d *
                                   light->QuadraticAttenuation));

        /* spotlight attenuation */
        if (light->_Flags & LIGHT_SPOT) {
           GLfloat PV_dot_dir = - DOT3(VP, light->_NormDirection);

           if (PV_dot_dir<light->_CosCutoff) {
          continue; /* this light makes no contribution */
           }
           else {
          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
        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]);
#endif
        side = 0;
        correction = 1;
     }

     COPY_3V(contrib, light->_MatAmbient[side]);

     /* diffuse term */
     ACC_SCALE_SCALAR_3V(contrib, n_dot_VP, light->_MatDiffuse[side]);

     /* specular term - cannibalize VP... */
     {
        if (ctx->Light.Model.LocalViewer) {
           GLfloat v[3];
           COPY_3V(v, vertex);
           NORMALIZE_3FV(v);
           SUB_3V(VP, VP, v);                /* h = VP + VPe */
           h = VP;
           NORMALIZE_3FV(h);
        }
        else if (light->_Flags & LIGHT_POSITIONAL) {
           h = VP;
           ACC_3V(h, ctx->_EyeZDir);
           NORMALIZE_3FV(h);
        }
            else {
           h = light->_h_inf_norm;
        }

        n_dot_h = correction * DOT3(normal, h);

        if (n_dot_h > 0.0F)
        {
           GLfloat spec_coef;
           struct gl_shine_tab *tab = ctx->_ShineTable[side];

           GET_SHINE_TAB_ENTRY( tab, n_dot_h, spec_coef );

           ACC_SCALE_SCALAR_3V( contrib, spec_coef,
                    light->_MatSpecular[side]);
        }
     }

     ACC_SCALE_SCALAR_3V( sum[side], attenuation, contrib );
      }

      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
   }
}

Generated on Sun May 27 2012 04:59:57 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.