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