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 //
21 // rb_light.c
22 //
23
24 #include "rb_local.h"
25
26 /*
27 =============================================================================
28
29 DYNAMIC LIGHTS
30
31 =============================================================================
32 */
33
34 /*
35 =============
36 RB_DrawDLights
37 =============
38 */
39 #define DEBUGLIGHT_SIZE 8
RB_DrawDLights(void)40 void RB_DrawDLights (void)
41 {
42 int k;
43 refDLight_t *light;
44 float a, rad;
45 vec3_t v;
46 uint32 i;
47
48 if (r_debugLighting->intVal) {
49 RB_SelectTexture (0);
50 RB_TextureTarget (0);
51 RB_StateForBits (SB1_BLEND_ON|SB1_DEFAULT);
52
53 for (light=ri.scn.dLightList, i=0 ; i<ri.scn.numDLights ; i++, light++) {
54 //
55 // Radius
56 //
57 qglColor4f (light->color[0], light->color[1], light->color[2], 0.2f);
58
59 qglBegin (GL_TRIANGLE_FAN);
60 qglVertex3f (light->origin[0] - (ri.def.viewAxis[0][0] * light->intensity),
61 light->origin[1] - (ri.def.viewAxis[0][1] * light->intensity),
62 light->origin[2] - (ri.def.viewAxis[0][2] * light->intensity));
63
64 for (k=32 ; k>=0 ; k--) {
65 a = (k / 32.0f) * (M_PI * 2.0f);
66
67 v[0] = light->origin[0] + (-ri.def.viewAxis[1][0] * (float)cos (a) * light->intensity) + (ri.def.viewAxis[2][0] * (float)sin (a) * light->intensity);
68 v[1] = light->origin[1] + (-ri.def.viewAxis[1][1] * (float)cos (a) * light->intensity) + (ri.def.viewAxis[2][1] * (float)sin (a) * light->intensity);
69 v[2] = light->origin[2] + (-ri.def.viewAxis[1][2] * (float)cos (a) * light->intensity) + (ri.def.viewAxis[2][2] * (float)sin (a) * light->intensity);
70 qglVertex3fv (v);
71 }
72 qglEnd ();
73
74 //
75 // Box
76 //
77 qglColor4f (light->color[0], light->color[1], light->color[2], 1);
78
79 // Top
80 qglBegin (GL_LINES);
81 qglVertex3f (light->origin[0] + DEBUGLIGHT_SIZE, light->origin[1] + DEBUGLIGHT_SIZE, light->origin[2] + DEBUGLIGHT_SIZE);
82 qglVertex3f (light->origin[0] - DEBUGLIGHT_SIZE, light->origin[1] + DEBUGLIGHT_SIZE, light->origin[2] + DEBUGLIGHT_SIZE);
83
84 qglVertex3f (light->origin[0] - DEBUGLIGHT_SIZE, light->origin[1] + DEBUGLIGHT_SIZE, light->origin[2] + DEBUGLIGHT_SIZE);
85 qglVertex3f (light->origin[0] - DEBUGLIGHT_SIZE, light->origin[1] - DEBUGLIGHT_SIZE, light->origin[2] + DEBUGLIGHT_SIZE);
86
87 qglVertex3f (light->origin[0] - DEBUGLIGHT_SIZE, light->origin[1] - DEBUGLIGHT_SIZE, light->origin[2] + DEBUGLIGHT_SIZE);
88 qglVertex3f (light->origin[0] + DEBUGLIGHT_SIZE, light->origin[1] - DEBUGLIGHT_SIZE, light->origin[2] + DEBUGLIGHT_SIZE);
89
90 qglVertex3f (light->origin[0] + DEBUGLIGHT_SIZE, light->origin[1] - DEBUGLIGHT_SIZE, light->origin[2] + DEBUGLIGHT_SIZE);
91 qglVertex3f (light->origin[0] + DEBUGLIGHT_SIZE, light->origin[1] + DEBUGLIGHT_SIZE, light->origin[2] + DEBUGLIGHT_SIZE);
92 qglEnd ();
93
94 // Bottom
95 qglBegin (GL_LINES);
96 qglVertex3f (light->origin[0] + DEBUGLIGHT_SIZE, light->origin[1] + DEBUGLIGHT_SIZE, light->origin[2] - DEBUGLIGHT_SIZE);
97 qglVertex3f (light->origin[0] - DEBUGLIGHT_SIZE, light->origin[1] + DEBUGLIGHT_SIZE, light->origin[2] - DEBUGLIGHT_SIZE);
98
99 qglVertex3f (light->origin[0] - DEBUGLIGHT_SIZE, light->origin[1] + DEBUGLIGHT_SIZE, light->origin[2] - DEBUGLIGHT_SIZE);
100 qglVertex3f (light->origin[0] - DEBUGLIGHT_SIZE, light->origin[1] - DEBUGLIGHT_SIZE, light->origin[2] - DEBUGLIGHT_SIZE);
101
102 qglVertex3f (light->origin[0] - DEBUGLIGHT_SIZE, light->origin[1] - DEBUGLIGHT_SIZE, light->origin[2] - DEBUGLIGHT_SIZE);
103 qglVertex3f (light->origin[0] + DEBUGLIGHT_SIZE, light->origin[1] - DEBUGLIGHT_SIZE, light->origin[2] - DEBUGLIGHT_SIZE);
104
105 qglVertex3f (light->origin[0] + DEBUGLIGHT_SIZE, light->origin[1] - DEBUGLIGHT_SIZE, light->origin[2] - DEBUGLIGHT_SIZE);
106 qglVertex3f (light->origin[0] + DEBUGLIGHT_SIZE, light->origin[1] + DEBUGLIGHT_SIZE, light->origin[2] - DEBUGLIGHT_SIZE);
107 qglEnd ();
108
109 // Corners
110 qglBegin (GL_LINES);
111 qglVertex3f (light->origin[0] + DEBUGLIGHT_SIZE, light->origin[1] + DEBUGLIGHT_SIZE, light->origin[2] + DEBUGLIGHT_SIZE);
112 qglVertex3f (light->origin[0] + DEBUGLIGHT_SIZE, light->origin[1] + DEBUGLIGHT_SIZE, light->origin[2] - DEBUGLIGHT_SIZE);
113
114 qglVertex3f (light->origin[0] - DEBUGLIGHT_SIZE, light->origin[1] + DEBUGLIGHT_SIZE, light->origin[2] + DEBUGLIGHT_SIZE);
115 qglVertex3f (light->origin[0] - DEBUGLIGHT_SIZE, light->origin[1] + DEBUGLIGHT_SIZE, light->origin[2] - DEBUGLIGHT_SIZE);
116
117 qglVertex3f (light->origin[0] - DEBUGLIGHT_SIZE, light->origin[1] - DEBUGLIGHT_SIZE, light->origin[2] + DEBUGLIGHT_SIZE);
118 qglVertex3f (light->origin[0] - DEBUGLIGHT_SIZE, light->origin[1] - DEBUGLIGHT_SIZE, light->origin[2] - DEBUGLIGHT_SIZE);
119
120 qglVertex3f (light->origin[0] + DEBUGLIGHT_SIZE, light->origin[1] - DEBUGLIGHT_SIZE, light->origin[2] + DEBUGLIGHT_SIZE);
121 qglVertex3f (light->origin[0] + DEBUGLIGHT_SIZE, light->origin[1] - DEBUGLIGHT_SIZE, light->origin[2] - DEBUGLIGHT_SIZE);
122 qglEnd ();
123
124 //
125 // Bounds
126 //
127 qglColor4f (light->color[0], light->color[1], light->color[2], 1);
128
129 // Top
130 qglBegin (GL_LINES);
131 qglVertex3f (light->maxs[0], light->maxs[1], light->maxs[2]);
132 qglVertex3f (light->mins[0], light->maxs[1], light->maxs[2]);
133
134 qglVertex3f (light->mins[0], light->maxs[1], light->maxs[2]);
135 qglVertex3f (light->mins[0], light->mins[1], light->maxs[2]);
136
137 qglVertex3f (light->mins[0], light->mins[1], light->maxs[2]);
138 qglVertex3f (light->maxs[0], light->mins[1], light->maxs[2]);
139
140 qglVertex3f (light->maxs[0], light->mins[1], light->maxs[2]);
141 qglVertex3f (light->maxs[0], light->maxs[1], light->maxs[2]);
142 qglEnd ();
143
144 // Bottom
145 qglBegin (GL_LINES);
146 qglVertex3f (light->maxs[0], light->maxs[1], light->mins[2]);
147 qglVertex3f (light->mins[0], light->maxs[1], light->mins[2]);
148
149 qglVertex3f (light->mins[0], light->maxs[1], light->mins[2]);
150 qglVertex3f (light->mins[0], light->mins[1], light->mins[2]);
151
152 qglVertex3f (light->mins[0], light->mins[1], light->mins[2]);
153 qglVertex3f (light->maxs[0], light->mins[1], light->mins[2]);
154
155 qglVertex3f (light->maxs[0], light->mins[1], light->mins[2]);
156 qglVertex3f (light->maxs[0], light->maxs[1], light->mins[2]);
157 qglEnd ();
158
159 // Corners
160 qglBegin (GL_LINES);
161 qglVertex3f (light->maxs[0], light->maxs[1], light->maxs[2]);
162 qglVertex3f (light->maxs[0], light->maxs[1], light->mins[2]);
163
164 qglVertex3f (light->mins[0], light->maxs[1], light->maxs[2]);
165 qglVertex3f (light->mins[0], light->maxs[1], light->mins[2]);
166
167 qglVertex3f (light->mins[0], light->mins[1], light->maxs[2]);
168 qglVertex3f (light->mins[0], light->mins[1], light->mins[2]);
169
170 qglVertex3f (light->maxs[0], light->mins[1], light->maxs[2]);
171 qglVertex3f (light->maxs[0], light->mins[1], light->mins[2]);
172 qglEnd ();
173 }
174
175 RB_StateForBits (SB1_DEPTHMASK_ON|SB1_DEFAULT);
176 RB_TextureTarget (GL_TEXTURE_2D);
177 }
178
179 if (!gl_flashblend->intVal)
180 return;
181
182 RB_SelectTexture (0);
183 RB_TextureTarget (0);
184 RB_StateForBits (SB1_DEPTHTEST_ON|SB1_BLEND_ON|SB1_BLENDSRC_ONE|SB1_BLENDDST_ONE);
185
186 for (light=ri.scn.dLightList, i=0 ; i<ri.scn.numDLights ; i++, light++) {
187 rad = light->intensity * 0.7f;
188 qglBegin (GL_TRIANGLE_FAN);
189
190 qglColor3f (light->color[0] * 0.2f, light->color[1] * 0.2f, light->color[2] * 0.2f);
191
192 v[0] = light->origin[0] - (ri.def.viewAxis[0][0] * rad);
193 v[1] = light->origin[1] - (ri.def.viewAxis[0][1] * rad);
194 v[2] = light->origin[2] - (ri.def.viewAxis[0][2] * rad);
195 qglVertex3fv (v);
196
197 qglColor3f (0, 0, 0);
198 for (k=32 ; k>=0 ; k--) {
199 a = (k / 32.0f) * (M_PI * 2.0f);
200
201 v[0] = light->origin[0] + (ri.def.rightVec[0] * (float)cos (a) * rad) + (ri.def.viewAxis[2][0] * (float)sin (a) * rad);
202 v[1] = light->origin[1] + (ri.def.rightVec[1] * (float)cos (a) * rad) + (ri.def.viewAxis[2][1] * (float)sin (a) * rad);
203 v[2] = light->origin[2] + (ri.def.rightVec[2] * (float)cos (a) * rad) + (ri.def.viewAxis[2][2] * (float)sin (a) * rad);
204 qglVertex3fv (v);
205 }
206
207 qglEnd ();
208 }
209
210 RB_StateForBits (SB1_DEPTHMASK_ON|SB1_DEFAULT);
211 RB_TextureTarget (GL_TEXTURE_2D);
212 }
213