vkQuake2 doxygen  1.0 dev
gl_light.c
Go to the documentation of this file.
1 /*
2 Copyright (C) 1997-2001 Id Software, Inc.
3 
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8 
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 
13 See the GNU General Public License for more details.
14 
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 
19 */
20 // r_light.c
21 
22 #include "gl_local.h"
23 
25 
26 #define DLIGHT_CUTOFF 64
27 
28 /*
29 =============================================================================
30 
31 DYNAMIC LIGHTS BLEND RENDERING
32 
33 =============================================================================
34 */
35 
36 void R_RenderDlight (dlight_t *light)
37 {
38  int i, j;
39  float a;
40  vec3_t v;
41  float rad;
42 
43  rad = light->intensity * 0.35;
44 
45  VectorSubtract (light->origin, r_origin, v);
46 #if 0
47  // FIXME?
48  if (VectorLength (v) < rad)
49  { // view is inside the dlight
50  V_AddBlend (light->color[0], light->color[1], light->color[2], light->intensity * 0.0003, v_blend);
51  return;
52  }
53 #endif
54 
55  qglBegin (GL_TRIANGLE_FAN);
56  qglColor3f (light->color[0]*0.2, light->color[1]*0.2, light->color[2]*0.2);
57  for (i=0 ; i<3 ; i++)
58  v[i] = light->origin[i] - vpn[i]*rad;
59  qglVertex3fv (v);
60  qglColor3f (0,0,0);
61  for (i=16 ; i>=0 ; i--)
62  {
63  a = i/16.0 * M_PI*2;
64  for (j=0 ; j<3 ; j++)
65  v[j] = light->origin[j] + vright[j]*cos(a)*rad
66  + vup[j]*sin(a)*rad;
67  qglVertex3fv (v);
68  }
69  qglEnd ();
70 }
71 
72 /*
73 =============
74 R_RenderDlights
75 =============
76 */
77 void R_RenderDlights (void)
78 {
79  int i;
80  dlight_t *l;
81 
82  if (!gl_flashblend->value)
83  return;
84 
85  r_dlightframecount = r_framecount + 1; // because the count hasn't
86  // advanced yet for this frame
87  qglDepthMask (0);
88  qglDisable (GL_TEXTURE_2D);
89  qglShadeModel (GL_SMOOTH);
90  qglEnable (GL_BLEND);
91  qglBlendFunc (GL_ONE, GL_ONE);
92 
93  l = r_newrefdef.dlights;
94  for (i=0 ; i<r_newrefdef.num_dlights ; i++, l++)
95  R_RenderDlight (l);
96 
97  qglColor3f (1,1,1);
98  qglDisable (GL_BLEND);
99  qglEnable (GL_TEXTURE_2D);
100  qglBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
101  qglDepthMask (1);
102 }
103 
104 
105 /*
106 =============================================================================
107 
108 DYNAMIC LIGHTS
109 
110 =============================================================================
111 */
112 
113 /*
114 =============
115 R_MarkLights
116 =============
117 */
118 void R_MarkLights (dlight_t *light, int bit, mnode_t *node)
119 {
120  cplane_t *splitplane;
121  float dist;
122  msurface_t *surf;
123  int i;
124 
125  if (node->contents != -1)
126  return;
127 
128  splitplane = node->plane;
129  dist = DotProduct (light->origin, splitplane->normal) - splitplane->dist;
130 
131  if (dist > light->intensity-DLIGHT_CUTOFF)
132  {
133  R_MarkLights (light, bit, node->children[0]);
134  return;
135  }
136  if (dist < -light->intensity+DLIGHT_CUTOFF)
137  {
138  R_MarkLights (light, bit, node->children[1]);
139  return;
140  }
141 
142 // mark the polygons
143  surf = r_worldmodel->surfaces + node->firstsurface;
144  for (i=0 ; i<node->numsurfaces ; i++, surf++)
145  {
146  if (surf->dlightframe != r_dlightframecount)
147  {
148  surf->dlightbits = 0;
150  }
151  surf->dlightbits |= bit;
152  }
153 
154  R_MarkLights (light, bit, node->children[0]);
155  R_MarkLights (light, bit, node->children[1]);
156 }
157 
158 
159 /*
160 =============
161 R_PushDlights
162 =============
163 */
164 void R_PushDlights (void)
165 {
166  int i;
167  dlight_t *l;
168 
169  if (gl_flashblend->value)
170  return;
171 
172  r_dlightframecount = r_framecount + 1; // because the count hasn't
173  // advanced yet for this frame
174  l = r_newrefdef.dlights;
175  for (i=0 ; i<r_newrefdef.num_dlights ; i++, l++)
176  R_MarkLights ( l, 1<<i, r_worldmodel->nodes );
177 }
178 
179 
180 /*
181 =============================================================================
182 
183 LIGHT SAMPLING
184 
185 =============================================================================
186 */
187 
189 cplane_t *lightplane; // used as shadow plane
191 
192 int RecursiveLightPoint (mnode_t *node, vec3_t start, vec3_t end)
193 {
194  float front, back, frac;
195  int side;
196  cplane_t *plane;
197  vec3_t mid;
198  msurface_t *surf;
199  int s, t, ds, dt;
200  int i;
201  mtexinfo_t *tex;
202  byte *lightmap;
203  int maps;
204  int r;
205 
206  if (node->contents != -1)
207  return -1; // didn't hit anything
208 
209 // calculate mid point
210 
211 // FIXME: optimize for axial
212  plane = node->plane;
213  front = DotProduct (start, plane->normal) - plane->dist;
214  back = DotProduct (end, plane->normal) - plane->dist;
215  side = front < 0;
216 
217  if ( (back < 0) == side)
218  return RecursiveLightPoint (node->children[side], start, end);
219 
220  frac = front / (front-back);
221  mid[0] = start[0] + (end[0] - start[0])*frac;
222  mid[1] = start[1] + (end[1] - start[1])*frac;
223  mid[2] = start[2] + (end[2] - start[2])*frac;
224 
225 // go down front side
226  r = RecursiveLightPoint (node->children[side], start, mid);
227  if (r >= 0)
228  return r; // hit something
229 
230  if ( (back < 0) == side )
231  return -1; // didn't hit anuthing
232 
233 // check for impact on this node
234  VectorCopy (mid, lightspot);
235  lightplane = plane;
236 
237  surf = r_worldmodel->surfaces + node->firstsurface;
238  for (i=0 ; i<node->numsurfaces ; i++, surf++)
239  {
240  if (surf->flags&(SURF_DRAWTURB|SURF_DRAWSKY))
241  continue; // no lightmaps
242 
243  tex = surf->texinfo;
244 
245  s = DotProduct (mid, tex->vecs[0]) + tex->vecs[0][3];
246  t = DotProduct (mid, tex->vecs[1]) + tex->vecs[1][3];;
247 
248  if (s < surf->texturemins[0] ||
249  t < surf->texturemins[1])
250  continue;
251 
252  ds = s - surf->texturemins[0];
253  dt = t - surf->texturemins[1];
254 
255  if ( ds > surf->extents[0] || dt > surf->extents[1] )
256  continue;
257 
258  if (!surf->samples)
259  return 0;
260 
261  ds >>= 4;
262  dt >>= 4;
263 
264  lightmap = surf->samples;
266  if (lightmap)
267  {
268  vec3_t scale;
269 
270  lightmap += 3*(dt * ((surf->extents[0]>>4)+1) + ds);
271 
272  for (maps = 0 ; maps < MAXLIGHTMAPS && surf->styles[maps] != 255 ;
273  maps++)
274  {
275  for (i=0 ; i<3 ; i++)
276  scale[i] = gl_modulate->value*r_newrefdef.lightstyles[surf->styles[maps]].rgb[i];
277 
278  pointcolor[0] += lightmap[0] * scale[0] * (1.0/255);
279  pointcolor[1] += lightmap[1] * scale[1] * (1.0/255);
280  pointcolor[2] += lightmap[2] * scale[2] * (1.0/255);
281  lightmap += 3*((surf->extents[0]>>4)+1) *
282  ((surf->extents[1]>>4)+1);
283  }
284  }
285 
286  return 1;
287  }
288 
289 // go down back side
290  return RecursiveLightPoint (node->children[!side], mid, end);
291 }
292 
293 /*
294 ===============
295 R_LightPoint
296 ===============
297 */
298 void R_LightPoint (vec3_t p, vec3_t color)
299 {
300  vec3_t end;
301  float r;
302  int lnum;
303  dlight_t *dl;
304  float light;
305  vec3_t dist;
306  float add;
307 
308  if (!r_worldmodel->lightdata)
309  {
310  color[0] = color[1] = color[2] = 1.0;
311  return;
312  }
313 
314  end[0] = p[0];
315  end[1] = p[1];
316  end[2] = p[2] - 2048;
317 
319 
320  if (r == -1)
321  {
322  VectorCopy (vec3_origin, color);
323  }
324  else
325  {
326  VectorCopy (pointcolor, color);
327  }
328 
329  //
330  // add dynamic lights
331  //
332  light = 0;
333  dl = r_newrefdef.dlights;
334  for (lnum=0 ; lnum<r_newrefdef.num_dlights ; lnum++, dl++)
335  {
337  dl->origin,
338  dist);
339  add = dl->intensity - VectorLength(dist);
340  add *= (1.0/256);
341  if (add > 0)
342  {
343  VectorMA (color, add, dl->color, color);
344  }
345  }
346 
347  VectorScale (color, gl_modulate->value, color);
348 }
349 
350 
351 //===================================================================
352 
353 static float s_blocklights[34*34*3];
354 /*
355 ===============
356 R_AddDynamicLights
357 ===============
358 */
360 {
361  int lnum;
362  int sd, td;
363  float fdist, frad, fminlight;
364  vec3_t impact, local;
365  int s, t;
366  int i;
367  int smax, tmax;
368  mtexinfo_t *tex;
369  dlight_t *dl;
370  float *pfBL;
371  float fsacc, ftacc;
372 
373  smax = (surf->extents[0]>>4)+1;
374  tmax = (surf->extents[1]>>4)+1;
375  tex = surf->texinfo;
376 
377  for (lnum=0 ; lnum<r_newrefdef.num_dlights ; lnum++)
378  {
379  if ( !(surf->dlightbits & (1<<lnum) ) )
380  continue; // not lit by this light
381 
382  dl = &r_newrefdef.dlights[lnum];
383  frad = dl->intensity;
384  fdist = DotProduct (dl->origin, surf->plane->normal) -
385  surf->plane->dist;
386  frad -= fabs(fdist);
387  // rad is now the highest intensity on the plane
388 
389  fminlight = DLIGHT_CUTOFF; // FIXME: make configurable?
390  if (frad < fminlight)
391  continue;
392  fminlight = frad - fminlight;
393 
394  for (i=0 ; i<3 ; i++)
395  {
396  impact[i] = dl->origin[i] -
397  surf->plane->normal[i]*fdist;
398  }
399 
400  local[0] = DotProduct (impact, tex->vecs[0]) + tex->vecs[0][3] - surf->texturemins[0];
401  local[1] = DotProduct (impact, tex->vecs[1]) + tex->vecs[1][3] - surf->texturemins[1];
402 
403  pfBL = s_blocklights;
404  for (t = 0, ftacc = 0 ; t<tmax ; t++, ftacc += 16)
405  {
406  td = local[1] - ftacc;
407  if ( td < 0 )
408  td = -td;
409 
410  for ( s=0, fsacc = 0 ; s<smax ; s++, fsacc += 16, pfBL += 3)
411  {
412  sd = Q_ftol( local[0] - fsacc );
413 
414  if ( sd < 0 )
415  sd = -sd;
416 
417  if (sd > td)
418  fdist = sd + (td>>1);
419  else
420  fdist = td + (sd>>1);
421 
422  if ( fdist < fminlight )
423  {
424  pfBL[0] += ( frad - fdist ) * dl->color[0];
425  pfBL[1] += ( frad - fdist ) * dl->color[1];
426  pfBL[2] += ( frad - fdist ) * dl->color[2];
427  }
428  }
429  }
430  }
431 }
432 
433 
434 /*
435 ** R_SetCacheState
436 */
438 {
439  int maps;
440 
441  for (maps = 0 ; maps < MAXLIGHTMAPS && surf->styles[maps] != 255 ;
442  maps++)
443  {
444  surf->cached_light[maps] = r_newrefdef.lightstyles[surf->styles[maps]].white;
445  }
446 }
447 
448 /*
449 ===============
450 R_BuildLightMap
451 
452 Combine and scale multiple lightmaps into the floating format in blocklights
453 ===============
454 */
455 void R_BuildLightMap (msurface_t *surf, byte *dest, int stride)
456 {
457  int smax, tmax;
458  int r, g, b, a, max;
459  int i, j, size;
460  byte *lightmap;
461  float scale[4];
462  int nummaps;
463  float *bl;
464  lightstyle_t *style;
465  int monolightmap;
466 
468  ri.Sys_Error (ERR_DROP, "R_BuildLightMap called for non-lit surface");
469 
470  smax = (surf->extents[0]>>4)+1;
471  tmax = (surf->extents[1]>>4)+1;
472  size = smax*tmax;
473  if (size > (sizeof(s_blocklights)>>4) )
474  ri.Sys_Error (ERR_DROP, "Bad s_blocklights size");
475 
476 // set to full bright if no light data
477  if (!surf->samples)
478  {
479  int maps;
480 
481  for (i=0 ; i<size*3 ; i++)
482  s_blocklights[i] = 255;
483  for (maps = 0 ; maps < MAXLIGHTMAPS && surf->styles[maps] != 255 ;
484  maps++)
485  {
486  style = &r_newrefdef.lightstyles[surf->styles[maps]];
487  }
488  goto store;
489  }
490 
491  // count the # of maps
492  for ( nummaps = 0 ; nummaps < MAXLIGHTMAPS && surf->styles[nummaps] != 255 ;
493  nummaps++)
494  ;
495 
496  lightmap = surf->samples;
497 
498  // add all the lightmaps
499  if ( nummaps == 1 )
500  {
501  int maps;
502 
503  for (maps = 0 ; maps < MAXLIGHTMAPS && surf->styles[maps] != 255 ;
504  maps++)
505  {
506  bl = s_blocklights;
507 
508  for (i=0 ; i<3 ; i++)
509  scale[i] = gl_modulate->value*r_newrefdef.lightstyles[surf->styles[maps]].rgb[i];
510 
511  if ( scale[0] == 1.0F &&
512  scale[1] == 1.0F &&
513  scale[2] == 1.0F )
514  {
515  for (i=0 ; i<size ; i++, bl+=3)
516  {
517  bl[0] = lightmap[i*3+0];
518  bl[1] = lightmap[i*3+1];
519  bl[2] = lightmap[i*3+2];
520  }
521  }
522  else
523  {
524  for (i=0 ; i<size ; i++, bl+=3)
525  {
526  bl[0] = lightmap[i*3+0] * scale[0];
527  bl[1] = lightmap[i*3+1] * scale[1];
528  bl[2] = lightmap[i*3+2] * scale[2];
529  }
530  }
531  lightmap += size*3; // skip to next lightmap
532  }
533  }
534  else
535  {
536  int maps;
537 
538  memset( s_blocklights, 0, sizeof( s_blocklights[0] ) * size * 3 );
539 
540  for (maps = 0 ; maps < MAXLIGHTMAPS && surf->styles[maps] != 255 ;
541  maps++)
542  {
543  bl = s_blocklights;
544 
545  for (i=0 ; i<3 ; i++)
546  scale[i] = gl_modulate->value*r_newrefdef.lightstyles[surf->styles[maps]].rgb[i];
547 
548  if ( scale[0] == 1.0F &&
549  scale[1] == 1.0F &&
550  scale[2] == 1.0F )
551  {
552  for (i=0 ; i<size ; i++, bl+=3 )
553  {
554  bl[0] += lightmap[i*3+0];
555  bl[1] += lightmap[i*3+1];
556  bl[2] += lightmap[i*3+2];
557  }
558  }
559  else
560  {
561  for (i=0 ; i<size ; i++, bl+=3)
562  {
563  bl[0] += lightmap[i*3+0] * scale[0];
564  bl[1] += lightmap[i*3+1] * scale[1];
565  bl[2] += lightmap[i*3+2] * scale[2];
566  }
567  }
568  lightmap += size*3; // skip to next lightmap
569  }
570  }
571 
572 // add all the dynamic lights
573  if (surf->dlightframe == r_framecount)
574  R_AddDynamicLights (surf);
575 
576 // put into texture format
577 store:
578  stride -= (smax<<2);
579  bl = s_blocklights;
580 
581  monolightmap = gl_monolightmap->string[0];
582 
583  if ( monolightmap == '0' )
584  {
585  for (i=0 ; i<tmax ; i++, dest += stride)
586  {
587  for (j=0 ; j<smax ; j++)
588  {
589 
590  r = Q_ftol( bl[0] );
591  g = Q_ftol( bl[1] );
592  b = Q_ftol( bl[2] );
593 
594  // catch negative lights
595  if (r < 0)
596  r = 0;
597  if (g < 0)
598  g = 0;
599  if (b < 0)
600  b = 0;
601 
602  /*
603  ** determine the brightest of the three color components
604  */
605  if (r > g)
606  max = r;
607  else
608  max = g;
609  if (b > max)
610  max = b;
611 
612  /*
613  ** alpha is ONLY used for the mono lightmap case. For this reason
614  ** we set it to the brightest of the color components so that
615  ** things don't get too dim.
616  */
617  a = max;
618 
619  /*
620  ** rescale all the color components if the intensity of the greatest
621  ** channel exceeds 1.0
622  */
623  if (max > 255)
624  {
625  float t = 255.0F / max;
626 
627  r = r*t;
628  g = g*t;
629  b = b*t;
630  a = a*t;
631  }
632 
633  dest[0] = r;
634  dest[1] = g;
635  dest[2] = b;
636  dest[3] = a;
637 
638  bl += 3;
639  dest += 4;
640  }
641  }
642  }
643  else
644  {
645  for (i=0 ; i<tmax ; i++, dest += stride)
646  {
647  for (j=0 ; j<smax ; j++)
648  {
649 
650  r = Q_ftol( bl[0] );
651  g = Q_ftol( bl[1] );
652  b = Q_ftol( bl[2] );
653 
654  // catch negative lights
655  if (r < 0)
656  r = 0;
657  if (g < 0)
658  g = 0;
659  if (b < 0)
660  b = 0;
661 
662  /*
663  ** determine the brightest of the three color components
664  */
665  if (r > g)
666  max = r;
667  else
668  max = g;
669  if (b > max)
670  max = b;
671 
672  /*
673  ** alpha is ONLY used for the mono lightmap case. For this reason
674  ** we set it to the brightest of the color components so that
675  ** things don't get too dim.
676  */
677  a = max;
678 
679  /*
680  ** rescale all the color components if the intensity of the greatest
681  ** channel exceeds 1.0
682  */
683  if (max > 255)
684  {
685  float t = 255.0F / max;
686 
687  r = r*t;
688  g = g*t;
689  b = b*t;
690  a = a*t;
691  }
692 
693  /*
694  ** So if we are doing alpha lightmaps we need to set the R, G, and B
695  ** components to 0 and we need to set alpha to 1-alpha.
696  */
697  switch ( monolightmap )
698  {
699  case 'L':
700  case 'I':
701  r = a;
702  g = b = 0;
703  break;
704  case 'C':
705  // try faking colored lighting
706  a = 255 - ((r+g+b)/3);
707  r *= a/255.0;
708  g *= a/255.0;
709  b *= a/255.0;
710  break;
711  case 'A':
712  default:
713  r = g = b = 0;
714  a = 255 - a;
715  break;
716  }
717 
718  dest[0] = r;
719  dest[1] = g;
720  dest[2] = b;
721  dest[3] = a;
722 
723  bl += 3;
724  dest += 4;
725  }
726  }
727  }
728 }
729 
nummaps
static int nummaps
Definition: menu.c:2393
cplane_s::normal
vec3_t normal
Definition: q_shared.h:415
r_framecount
int r_framecount
Definition: r_main.c:97
msurface_s::plane
mplane_t * plane
Definition: r_model.h:100
msurface_s::styles
byte styles[MAXLIGHTMAPS]
Definition: r_model.h:115
entity_s::origin
float origin[3]
Definition: ref.h:57
lightstyle_t::rgb
float rgb[3]
Definition: ref.h:98
VectorSubtract
#define VectorSubtract(a, b, c)
Definition: q_shared.h:163
gl_modulate
cvar_t * gl_modulate
Definition: gl_rmain.c:118
ri
refimport_t ri
Definition: r_main.c:25
lightplane
cplane_t * lightplane
Definition: gl_light.c:189
v
GLdouble v
Definition: qgl_win.c:143
vright
vec3_t vright
Definition: r_main.c:74
mtexinfo_s
Definition: r_model.h:83
R_SetCacheState
void R_SetCacheState(msurface_t *surf)
Definition: gl_light.c:437
RecursiveLightPoint
int RecursiveLightPoint(mnode_t *node, vec3_t start, vec3_t end)
Definition: gl_light.c:192
cvar_s::string
char * string
Definition: q_shared.h:327
VectorScale
void VectorScale(vec3_t in, vec_t scale, vec3_t out)
Definition: q_shared.c:782
i
int i
Definition: q_shared.c:305
msurface_s::dlightframe
int dlightframe
Definition: r_model.h:97
mnode_s
Definition: r_model.h:123
dlight_t::origin
vec3_t origin
Definition: ref.h:84
r_origin
vec3_t r_origin
Definition: r_main.c:75
v_blend
float v_blend[4]
Definition: gl_rmain.c:57
msurface_s::samples
byte * samples
Definition: r_model.h:116
mnode_s::children
struct mnode_s * children[2]
Definition: r_model.h:135
M_PI
#define M_PI
Definition: q_shared.h:142
currententity
entity_t * currententity
Definition: r_bsp.c:28
R_PushDlights
void R_PushDlights(void)
Definition: gl_light.c:164
SURF_WARP
#define SURF_WARP
Definition: qfiles.h:372
mplane_s::normal
vec3_t normal
Definition: r_model.h:59
msurface_s::extents
short extents[2]
Definition: r_model.h:110
msurface_s::cached_light
float cached_light[MAXLIGHTMAPS]
Definition: gl_model.h:123
intensity
cvar_t * intensity
Definition: gl_image.c:31
R_MarkLights
void R_MarkLights(dlight_t *light, int bit, mnode_t *node)
Definition: gl_light.c:118
SURF_TRANS66
#define SURF_TRANS66
Definition: qfiles.h:374
R_RenderDlight
void R_RenderDlight(dlight_t *light)
Definition: gl_light.c:36
lightspot
vec3_t lightspot
Definition: gl_light.c:190
vup
vec3_t vup
Definition: r_main.c:72
j
GLint j
Definition: qgl_win.c:150
r_dlightframecount
int r_dlightframecount
Definition: gl_light.c:24
r
GLdouble GLdouble r
Definition: qgl_win.c:336
mplane_s::dist
float dist
Definition: r_model.h:60
refdef_t::num_dlights
int num_dlights
Definition: ref.h:119
VectorLength
vec_t VectorLength(vec3_t v)
Definition: q_shared.c:762
msurface_s::texinfo
mtexinfo_t * texinfo
Definition: r_model.h:112
t
GLdouble t
Definition: qgl_win.c:328
model_s::nodes
mnode_t * nodes
Definition: r_model.h:215
Q_ftol
long Q_ftol(float f)
refimport_t::Sys_Error
void(* Sys_Error)(int err_level, char *str,...)
Definition: ref.h:194
SURF_DRAWSKY
#define SURF_DRAWSKY
Definition: r_model.h:69
dlight_t::color
vec3_t color
Definition: ref.h:85
R_BuildLightMap
void R_BuildLightMap(msurface_t *surf, byte *dest, int stride)
Definition: gl_light.c:455
r_newrefdef
refdef_t r_newrefdef
Definition: r_main.c:38
DotProduct
#define DotProduct(x, y)
Definition: q_shared.h:162
SURF_TRANS33
#define SURF_TRANS33
Definition: qfiles.h:373
r_worldmodel
model_t * r_worldmodel
Definition: r_main.c:41
cvar_s::value
float value
Definition: q_shared.h:331
cplane_s::dist
float dist
Definition: q_shared.h:416
model_s::lightdata
byte * lightdata
Definition: r_model.h:231
SURF_DRAWTURB
#define SURF_DRAWTURB
Definition: r_model.h:70
F
#define F(X, Y, Z)
Definition: md4.c:13
gl_flashblend
cvar_t * gl_flashblend
Definition: gl_rmain.c:129
ERR_DROP
#define ERR_DROP
Definition: qcommon.h:744
MAXLIGHTMAPS
#define MAXLIGHTMAPS
Definition: qfiles.h:409
msurface_s::flags
int flags
Definition: r_model.h:101
lightstyle_t
Definition: ref.h:96
R_LightPoint
void R_LightPoint(vec3_t p, vec3_t color)
Definition: gl_light.c:298
s
static fixed16_t s
Definition: r_scan.c:30
VectorCopy
#define VectorCopy(a, b)
Definition: q_shared.h:165
refdef_t::lightstyles
lightstyle_t * lightstyles
Definition: ref.h:114
mtexinfo_s::vecs
float vecs[2][4]
Definition: r_model.h:85
vec3_origin
vec3_t vec3_origin
Definition: q_shared.c:24
R_RenderDlights
void R_RenderDlights(void)
Definition: gl_light.c:77
pointcolor
vec3_t pointcolor
Definition: gl_light.c:188
mnode_s::contents
int contents
Definition: r_model.h:126
mnode_s::firstsurface
unsigned short firstsurface
Definition: r_model.h:137
dlight_t
Definition: ref.h:82
model_s::surfaces
msurface_t * surfaces
Definition: r_model.h:221
mnode_s::plane
mplane_t * plane
Definition: r_model.h:134
VectorMA
void VectorMA(vec3_t veca, float scale, vec3_t vecb, vec3_t vecc)
Definition: q_shared.c:719
local
static vec3_t local
Definition: r_part.c:468
gl_local.h
stride
GLenum GLsizei stride
Definition: qgl_win.c:114
msurface_s
Definition: r_model.h:93
R_AddDynamicLights
void R_AddDynamicLights(msurface_t *surf)
Definition: gl_light.c:359
mtexinfo_s::flags
int flags
Definition: r_model.h:88
refdef_t::dlights
dlight_t * dlights
Definition: ref.h:120
msurface_s::texturemins
short texturemins[2]
Definition: r_model.h:109
lightstyle_t::white
float white
Definition: ref.h:99
msurface_s::dlightbits
int dlightbits
Definition: r_model.h:98
cplane_s
Definition: q_shared.h:413
mnode_s::numsurfaces
unsigned short numsurfaces
Definition: r_model.h:138
DLIGHT_CUTOFF
#define DLIGHT_CUTOFF
Definition: gl_light.c:26
vpn
vec3_t vpn
Definition: r_main.c:73
gl_monolightmap
cvar_t * gl_monolightmap
Definition: gl_rmain.c:117
max
#define max(a, b)
Definition: vk_local.h:75
dlight_t::intensity
float intensity
Definition: ref.h:86
vec3_t
vec_t vec3_t[3]
Definition: q_shared.h:134
s_blocklights
static float s_blocklights[34 *34 *3]
Definition: gl_light.c:353
V_AddBlend
void V_AddBlend(float r, float g, float b, float a, float *v_blend)
SURF_SKY
#define SURF_SKY
Definition: qfiles.h:371