1 /*
2 Copyright (C) 2001-2002 Charles Hollemeersch
3 Radeon Version (C) 2002 Jarno Paananen
4
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License
7 as published by the Free Software Foundation; either version 2
8 of the License, or (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
14 See the GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19
20 PENTA: the whole file is freakin penta...
21
22 Same as gl_bumpmap.c but Radeon 8500+ optimized
23 These routines require 6 texture units, vertex shader and pixel shader
24
25 This could be further optimized for Radeon 9700 (specular exponent for
26 example), but would need better documentation and extension.
27
28 All lights not require only 1 pass:
29 1 diffuse + specular with optional light filter
30
31 */
32
33 #include "quakedef.h"
34
35 #include "glATI.h"
36
37 PFNGLGENFRAGMENTSHADERSATIPROC qglGenFragmentShadersATI = NULL;
38 PFNGLBINDFRAGMENTSHADERATIPROC qglBindFragmentShaderATI = NULL;
39 PFNGLDELETEFRAGMENTSHADERATIPROC qglDeleteFragmentShaderATI = NULL;
40 PFNGLBEGINFRAGMENTSHADERATIPROC qglBeginFragmentShaderATI = NULL;
41 PFNGLENDFRAGMENTSHADERATIPROC qglEndFragmentShaderATI = NULL;
42 PFNGLPASSTEXCOORDATIPROC qglPassTexCoordATI = NULL;
43 PFNGLSAMPLEMAPATIPROC qglSampleMapATI = NULL;
44 PFNGLCOLORFRAGMENTOP1ATIPROC qglColorFragmentOp1ATI = NULL;
45 PFNGLCOLORFRAGMENTOP2ATIPROC qglColorFragmentOp2ATI = NULL;
46 PFNGLCOLORFRAGMENTOP3ATIPROC qglColorFragmentOp3ATI = NULL;
47 PFNGLALPHAFRAGMENTOP1ATIPROC qglAlphaFragmentOp1ATI = NULL;
48 PFNGLALPHAFRAGMENTOP2ATIPROC qglAlphaFragmentOp2ATI = NULL;
49 PFNGLALPHAFRAGMENTOP3ATIPROC qglAlphaFragmentOp3ATI = NULL;
50 PFNGLSETFRAGMENTSHADERCONSTANTATIPROC qglSetFragmentShaderConstantATI = NULL;
51 PFNGLBEGINVERTEXSHADEREXTPROC qglBeginVertexShaderEXT = NULL;
52 PFNGLENDVERTEXSHADEREXTPROC qglEndVertexShaderEXT = NULL;
53 PFNGLBINDVERTEXSHADEREXTPROC qglBindVertexShaderEXT = NULL;
54 PFNGLGENVERTEXSHADERSEXTPROC qglGenVertexShadersEXT = NULL;
55 PFNGLDELETEVERTEXSHADEREXTPROC qglDeleteVertexShaderEXT = NULL;
56 PFNGLSHADEROP1EXTPROC qglShaderOp1EXT = NULL;
57 PFNGLSHADEROP2EXTPROC qglShaderOp2EXT = NULL;
58 PFNGLSHADEROP3EXTPROC qglShaderOp3EXT = NULL;
59 PFNGLSWIZZLEEXTPROC qglSwizzleEXT = NULL;
60 PFNGLWRITEMASKEXTPROC qglWriteMaskEXT = NULL;
61 PFNGLINSERTCOMPONENTEXTPROC qglInsertComponentEXT = NULL;
62 PFNGLEXTRACTCOMPONENTEXTPROC qglExtractComponentEXT = NULL;
63 PFNGLGENSYMBOLSEXTPROC qglGenSymbolsEXT = NULL;
64 PFNGLSETINVARIANTEXTPROC qglSetInvariantEXT = NULL;
65 PFNGLSETLOCALCONSTANTEXTPROC qglSetLocalConstantEXT = NULL;
66 PFNGLVARIANTBVEXTPROC qglVariantbvEXT = NULL;
67 PFNGLVARIANTSVEXTPROC qglVariantsvEXT = NULL;
68 PFNGLVARIANTIVEXTPROC qglVariantivEXT = NULL;
69 PFNGLVARIANTFVEXTPROC qglVariantfvEXT = NULL;
70 PFNGLVARIANTDVEXTPROC qglVariantdvEXT = NULL;
71 PFNGLVARIANTUBVEXTPROC qglVariantubvEXT = NULL;
72 PFNGLVARIANTUSVEXTPROC qglVariantusvEXT = NULL;
73 PFNGLVARIANTUIVEXTPROC qglVariantuivEXT = NULL;
74 PFNGLVARIANTPOINTEREXTPROC qglVariantPointerEXT = NULL;
75 PFNGLENABLEVARIANTCLIENTSTATEEXTPROC qglEnableVariantClientStateEXT = NULL;
76 PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC qglDisableVariantClientStateEXT = NULL;
77 PFNGLBINDLIGHTPARAMETEREXTPROC qglBindLightParameterEXT = NULL;
78 PFNGLBINDMATERIALPARAMETEREXTPROC qglBindMaterialParameterEXT = NULL;
79 PFNGLBINDTEXGENPARAMETEREXTPROC qglBindTexGenParameterEXT = NULL;
80 PFNGLBINDTEXTUREUNITPARAMETEREXTPROC qglBindTextureUnitParameterEXT = NULL;
81 PFNGLBINDPARAMETEREXTPROC qglBindParameterEXT = NULL;
82 PFNGLISVARIANTENABLEDEXTPROC qglIsVariantEnabledEXT = NULL;
83 PFNGLGETVARIANTBOOLEANVEXTPROC qglGetVariantBooleanvEXT = NULL;
84 PFNGLGETVARIANTINTEGERVEXTPROC qglGetVariantIntegervEXT = NULL;
85 PFNGLGETVARIANTFLOATVEXTPROC qglGetVariantFloatvEXT = NULL;
86 PFNGLGETVARIANTPOINTERVEXTPROC qglGetVariantPointervEXT = NULL;
87 PFNGLGETINVARIANTBOOLEANVEXTPROC qglGetInvariantBooleanvEXT = NULL;
88 PFNGLGETINVARIANTINTEGERVEXTPROC qglGetInvariantIntegervEXT = NULL;
89 PFNGLGETINVARIANTFLOATVEXTPROC qglGetInvariantFloatvEXT = NULL;
90 PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC qglGetLocalConstantBooleanvEXT = NULL;
91 PFNGLGETLOCALCONSTANTINTEGERVEXTPROC qglGetLocalConstantIntegervEXT = NULL;
92 PFNGLGETLOCALCONSTANTFLOATVEXTPROC qglGetLocalConstantFloatvEXT = NULL;
93
94 PFNGLPNTRIANGLESIATIPROC qglPNTrianglesiATI = NULL;
95 PFNGLPNTRIANGLESFATIPROC qglPNTrianglesfATI = NULL;
96
97 static unsigned int fragment_shaders;
98 static unsigned int vertex_shaders;
99
100 //#define RADEONDEBUG
101
102 #ifdef RADEONDEBUG
checkerror()103 void checkerror()
104 {
105 GLuint error = glGetError();
106 if ( error != GL_NO_ERROR )
107 {
108 _asm { int 3 };
109 }
110 }
111 #else
112
113 #define checkerror() do { } while(0)
114
115 #endif
116
117 // <AWE> We look up the symbols here, this way we don't need to prototype all the "qgl" functions!
118 #if defined (__APPLE__) || defined (MACOSX)
119
120 extern void * GL_GetProcAddress (const char *theName, qboolean theSafeMode);
121
GL_LookupRadeonSymbols(void)122 qboolean GL_LookupRadeonSymbols (void)
123 {
124 qglGenFragmentShadersATI = GL_GetProcAddress ("glGenFragmentShadersATI", false);
125 qglBindFragmentShaderATI = GL_GetProcAddress ("glBindFragmentShaderATI", false);
126 qglDeleteFragmentShaderATI = GL_GetProcAddress ("glDeleteFragmentShaderATI", false);
127 qglBeginFragmentShaderATI = GL_GetProcAddress ("glBeginFragmentShaderATI", false);
128 qglEndFragmentShaderATI = GL_GetProcAddress ("glEndFragmentShaderATI", false);
129 qglPassTexCoordATI = GL_GetProcAddress ("glPassTexCoordATI", false);
130 qglSampleMapATI = GL_GetProcAddress ("glSampleMapATI", false);
131 qglColorFragmentOp1ATI = GL_GetProcAddress ("glColorFragmentOp1ATI", false);
132 qglColorFragmentOp2ATI = GL_GetProcAddress ("glColorFragmentOp2ATI", false);
133 qglColorFragmentOp3ATI = GL_GetProcAddress ("glColorFragmentOp3ATI", false);
134 qglAlphaFragmentOp1ATI = GL_GetProcAddress ("glAlphaFragmentOp1ATI", false);
135 qglAlphaFragmentOp2ATI = GL_GetProcAddress ("glAlphaFragmentOp2ATI", false);
136 qglAlphaFragmentOp3ATI = GL_GetProcAddress ("glAlphaFragmentOp3ATI", false);
137 qglSetFragmentShaderConstantATI = GL_GetProcAddress ("glSetFragmentShaderConstantATI", false);
138 qglBeginVertexShaderEXT = GL_GetProcAddress ("glBeginVertexShaderEXT", false);
139 qglEndVertexShaderEXT = GL_GetProcAddress ("glEndVertexShaderEXT", false);
140 qglBindVertexShaderEXT = GL_GetProcAddress ("glBindVertexShaderEXT", false);
141 qglGenVertexShadersEXT = GL_GetProcAddress ("glGenVertexShadersEXT", false);
142 qglDeleteVertexShaderEXT = GL_GetProcAddress ("glDeleteVertexShaderEXT", false);
143 qglShaderOp1EXT = GL_GetProcAddress ("glShaderOp1EXT", false);
144 qglShaderOp2EXT = GL_GetProcAddress ("glShaderOp2EXT", false);
145 qglShaderOp3EXT = GL_GetProcAddress ("glShaderOp3EXT", false);
146 qglSwizzleEXT = GL_GetProcAddress ("glSwizzleEXT", false);
147 qglWriteMaskEXT = GL_GetProcAddress ("glWriteMaskEXT", false);
148 qglInsertComponentEXT = GL_GetProcAddress ("glInsertComponentEXT", false);
149 qglExtractComponentEXT = GL_GetProcAddress ("glExtractComponentEXT", false);
150 qglGenSymbolsEXT = GL_GetProcAddress ("glGenSymbolsEXT", false);
151 qglSetInvariantEXT = GL_GetProcAddress ("glSetInvariantEXT", false);
152 qglSetLocalConstantEXT = GL_GetProcAddress ("glSetLocalConstantEXT", false);
153 qglVariantbvEXT = GL_GetProcAddress ("glVariantbvEXT", false);
154 qglVariantsvEXT = GL_GetProcAddress ("glVariantsvEXT", false);
155 qglVariantivEXT = GL_GetProcAddress ("glVariantivEXT", false);
156 qglVariantfvEXT = GL_GetProcAddress ("glVariantfvEXT", false);
157 qglVariantdvEXT = GL_GetProcAddress ("glVariantdvEXT", false);
158 qglVariantubvEXT = GL_GetProcAddress ("glVariantubvEXT", false);
159 qglVariantusvEXT = GL_GetProcAddress ("glVariantusvEXT", false);
160 qglVariantuivEXT = GL_GetProcAddress ("glVariantuivEXT", false);
161 qglVariantPointerEXT = GL_GetProcAddress ("glVariantPointerEXT", false);
162 qglEnableVariantClientStateEXT = GL_GetProcAddress ("glEnableVariantClientStateEXT", false);
163 qglDisableVariantClientStateEXT = GL_GetProcAddress ("glDisableVariantClientStateEXT", false);
164 qglBindLightParameterEXT = GL_GetProcAddress ("glBindLightParameterEXT", false);
165 qglBindMaterialParameterEXT = GL_GetProcAddress ("glBindMaterialParameterEXT", false);
166 qglBindTexGenParameterEXT = GL_GetProcAddress ("glBindTexGenParameterEXT", false);
167 qglBindTextureUnitParameterEXT = GL_GetProcAddress ("glBindTextureUnitParameterEXT", false);
168 qglBindParameterEXT = GL_GetProcAddress ("glBindParameterEXT", false);
169 qglIsVariantEnabledEXT = GL_GetProcAddress ("glIsVariantEnabledEXT", false);
170 qglGetVariantBooleanvEXT = GL_GetProcAddress ("glGetVariantBooleanvEXT", false);
171 qglGetVariantIntegervEXT = GL_GetProcAddress ("glGetVariantIntegervEXT", false);
172 qglGetVariantFloatvEXT = GL_GetProcAddress ("glGetVariantFloatvEXT", false);
173 qglGetVariantPointervEXT = GL_GetProcAddress ("glGetVariantPointervEXT", false);
174 qglGetInvariantBooleanvEXT = GL_GetProcAddress ("glGetInvariantBooleanvEXT", false);
175 qglGetInvariantIntegervEXT = GL_GetProcAddress ("glGetInvariantIntegervEXT", false);
176 qglGetInvariantFloatvEXT = GL_GetProcAddress ("glGetInvariantFloatvEXT", false);
177 qglGetLocalConstantBooleanvEXT = GL_GetProcAddress ("glGetLocalConstantBooleanvEXT", false);
178 qglGetLocalConstantIntegervEXT = GL_GetProcAddress ("glGetLocalConstantIntegervEXT", false);
179 qglGetLocalConstantFloatvEXT = GL_GetProcAddress ("glGetLocalConstantFloatvEXT", false);
180
181 if (qglGenFragmentShadersATI != NULL &&
182 qglBindFragmentShaderATI != NULL &&
183 qglDeleteFragmentShaderATI != NULL &&
184 qglBeginFragmentShaderATI != NULL &&
185 qglEndFragmentShaderATI != NULL &&
186 qglPassTexCoordATI != NULL &&
187 qglSampleMapATI != NULL &&
188 qglColorFragmentOp1ATI != NULL &&
189 qglColorFragmentOp2ATI != NULL &&
190 qglColorFragmentOp3ATI != NULL &&
191 qglAlphaFragmentOp1ATI != NULL &&
192 qglAlphaFragmentOp2ATI != NULL &&
193 qglAlphaFragmentOp3ATI != NULL &&
194 qglSetFragmentShaderConstantATI != NULL &&
195 qglBeginVertexShaderEXT != NULL &&
196 qglEndVertexShaderEXT != NULL &&
197 qglBindVertexShaderEXT != NULL &&
198 qglGenVertexShadersEXT != NULL &&
199 qglDeleteVertexShaderEXT != NULL &&
200 qglShaderOp1EXT != NULL &&
201 qglShaderOp2EXT != NULL &&
202 qglShaderOp3EXT != NULL &&
203 qglSwizzleEXT != NULL &&
204 qglWriteMaskEXT != NULL &&
205 qglInsertComponentEXT != NULL &&
206 qglExtractComponentEXT != NULL &&
207 qglGenSymbolsEXT != NULL &&
208 qglSetInvariantEXT != NULL &&
209 qglSetLocalConstantEXT != NULL &&
210 qglVariantbvEXT != NULL &&
211 qglVariantsvEXT != NULL &&
212 qglVariantivEXT != NULL &&
213 qglVariantfvEXT != NULL &&
214 qglVariantdvEXT != NULL &&
215 qglVariantubvEXT != NULL &&
216 qglVariantusvEXT != NULL &&
217 qglVariantuivEXT != NULL &&
218 qglVariantPointerEXT != NULL &&
219 qglEnableVariantClientStateEXT != NULL &&
220 qglDisableVariantClientStateEXT != NULL &&
221 qglBindLightParameterEXT != NULL &&
222 qglBindMaterialParameterEXT != NULL &&
223 qglBindTexGenParameterEXT != NULL &&
224 qglBindTextureUnitParameterEXT != NULL &&
225 qglBindParameterEXT != NULL &&
226 qglIsVariantEnabledEXT != NULL &&
227 qglGetVariantBooleanvEXT != NULL &&
228 qglGetVariantIntegervEXT != NULL &&
229 qglGetVariantFloatvEXT != NULL &&
230 qglGetVariantPointervEXT != NULL &&
231 qglGetInvariantBooleanvEXT != NULL &&
232 qglGetInvariantIntegervEXT != NULL &&
233 qglGetInvariantFloatvEXT != NULL &&
234 qglGetLocalConstantBooleanvEXT != NULL &&
235 qglGetLocalConstantIntegervEXT != NULL &&
236 qglGetLocalConstantFloatvEXT != NULL)
237 {
238 return (true);
239 }
240
241 return (false);
242 }
243
244 #endif /* __APPLE__ || MACOSX */
245
GL_CreateShadersRadeon()246 void GL_CreateShadersRadeon()
247 {
248 float scaler[4] = {0.5f, 0.5f, 0.5f, 0.5f};
249 int i;
250 GLuint mvp, modelview, zcomp;
251 GLuint texturematrix, texturematrix2;
252 GLuint vertex;
253 GLuint texcoord0;
254 GLuint texcoord1;
255 GLuint texcoord2;
256 GLuint color;
257 GLuint supportedTmu;
258 GLuint disttemp, disttemp2;
259 GLuint fogstart, fogend;
260
261 #if !defined(__APPLE__) && !defined (MACOSX)
262 SAFE_GET_PROC( qglGenFragmentShadersATI, PFNGLGENFRAGMENTSHADERSATIPROC, "glGenFragmentShadersATI");
263 SAFE_GET_PROC( qglBindFragmentShaderATI, PFNGLBINDFRAGMENTSHADERATIPROC, "glBindFragmentShaderATI");
264 SAFE_GET_PROC( qglDeleteFragmentShaderATI, PFNGLDELETEFRAGMENTSHADERATIPROC, "glDeleteFragmentShaderATI");
265 SAFE_GET_PROC( qglBeginFragmentShaderATI, PFNGLBEGINFRAGMENTSHADERATIPROC, "glBeginFragmentShaderATI");
266 SAFE_GET_PROC( qglEndFragmentShaderATI, PFNGLENDFRAGMENTSHADERATIPROC, "glEndFragmentShaderATI");
267 SAFE_GET_PROC( qglPassTexCoordATI, PFNGLPASSTEXCOORDATIPROC, "glPassTexCoordATI");
268 SAFE_GET_PROC( qglSampleMapATI, PFNGLSAMPLEMAPATIPROC, "glSampleMapATI");
269 SAFE_GET_PROC( qglColorFragmentOp1ATI, PFNGLCOLORFRAGMENTOP1ATIPROC, "glColorFragmentOp1ATI");
270 SAFE_GET_PROC( qglColorFragmentOp2ATI, PFNGLCOLORFRAGMENTOP2ATIPROC, "glColorFragmentOp2ATI");
271 SAFE_GET_PROC( qglColorFragmentOp3ATI, PFNGLCOLORFRAGMENTOP3ATIPROC, "glColorFragmentOp3ATI");
272 SAFE_GET_PROC( qglAlphaFragmentOp1ATI, PFNGLALPHAFRAGMENTOP1ATIPROC, "glAlphaFragmentOp1ATI");
273 SAFE_GET_PROC( qglAlphaFragmentOp2ATI, PFNGLALPHAFRAGMENTOP2ATIPROC, "glAlphaFragmentOp2ATI");
274 SAFE_GET_PROC( qglAlphaFragmentOp3ATI, PFNGLALPHAFRAGMENTOP3ATIPROC, "glAlphaFragmentOp3ATI");
275 SAFE_GET_PROC( qglSetFragmentShaderConstantATI, PFNGLSETFRAGMENTSHADERCONSTANTATIPROC, "glSetFragmentShaderConstantATI");
276 SAFE_GET_PROC( qglBeginVertexShaderEXT, PFNGLBEGINVERTEXSHADEREXTPROC, "glBeginVertexShaderEXT");
277 SAFE_GET_PROC( qglEndVertexShaderEXT, PFNGLENDVERTEXSHADEREXTPROC, "glEndVertexShaderEXT");
278 SAFE_GET_PROC( qglBindVertexShaderEXT, PFNGLBINDVERTEXSHADEREXTPROC, "glBindVertexShaderEXT");
279 SAFE_GET_PROC( qglGenVertexShadersEXT, PFNGLGENVERTEXSHADERSEXTPROC, "glGenVertexShadersEXT");
280 SAFE_GET_PROC( qglDeleteVertexShaderEXT, PFNGLDELETEVERTEXSHADEREXTPROC, "glDeleteVertexShaderEXT");
281 SAFE_GET_PROC( qglShaderOp1EXT, PFNGLSHADEROP1EXTPROC, "glShaderOp1EXT");
282 SAFE_GET_PROC( qglShaderOp2EXT, PFNGLSHADEROP2EXTPROC, "glShaderOp2EXT");
283 SAFE_GET_PROC( qglShaderOp3EXT, PFNGLSHADEROP3EXTPROC, "glShaderOp3EXT");
284 SAFE_GET_PROC( qglSwizzleEXT, PFNGLSWIZZLEEXTPROC, "glSwizzleEXT");
285 SAFE_GET_PROC( qglWriteMaskEXT, PFNGLWRITEMASKEXTPROC, "glWriteMaskEXT");
286 SAFE_GET_PROC( qglInsertComponentEXT, PFNGLINSERTCOMPONENTEXTPROC, "glInsertComponentEXT");
287 SAFE_GET_PROC( qglExtractComponentEXT, PFNGLEXTRACTCOMPONENTEXTPROC, "glExtractComponentEXT");
288 SAFE_GET_PROC( qglGenSymbolsEXT, PFNGLGENSYMBOLSEXTPROC, "glGenSymbolsEXT");
289 SAFE_GET_PROC( qglSetInvariantEXT, PFNGLSETINVARIANTEXTPROC, "glSetInvariantEXT");
290 SAFE_GET_PROC( qglSetLocalConstantEXT, PFNGLSETLOCALCONSTANTEXTPROC, "glSetLocalConstantEXT");
291 SAFE_GET_PROC( qglVariantbvEXT, PFNGLVARIANTBVEXTPROC, "glVariantbvEXT");
292 SAFE_GET_PROC( qglVariantsvEXT, PFNGLVARIANTSVEXTPROC, "glVariantsvEXT");
293 SAFE_GET_PROC( qglVariantivEXT, PFNGLVARIANTIVEXTPROC, "glVariantivEXT");
294 SAFE_GET_PROC( qglVariantfvEXT, PFNGLVARIANTFVEXTPROC, "glVariantfvEXT");
295 SAFE_GET_PROC( qglVariantdvEXT, PFNGLVARIANTDVEXTPROC, "glVariantdvEXT");
296 SAFE_GET_PROC( qglVariantubvEXT, PFNGLVARIANTUBVEXTPROC, "glVariantubvEXT");
297 SAFE_GET_PROC( qglVariantusvEXT, PFNGLVARIANTUSVEXTPROC, "glVariantusvEXT");
298 SAFE_GET_PROC( qglVariantuivEXT, PFNGLVARIANTUIVEXTPROC, "glVariantuivEXT");
299 SAFE_GET_PROC( qglVariantPointerEXT, PFNGLVARIANTPOINTEREXTPROC, "glVariantPointerEXT");
300 SAFE_GET_PROC( qglEnableVariantClientStateEXT, PFNGLENABLEVARIANTCLIENTSTATEEXTPROC, "glEnableVariantClientStateEXT");
301 SAFE_GET_PROC( qglDisableVariantClientStateEXT, PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC, "glDisableVariantClientStateEXT");
302 SAFE_GET_PROC( qglBindLightParameterEXT, PFNGLBINDLIGHTPARAMETEREXTPROC, "glBindLightParameterEXT");
303 SAFE_GET_PROC( qglBindMaterialParameterEXT, PFNGLBINDMATERIALPARAMETEREXTPROC, "glBindMaterialParameterEXT");
304 SAFE_GET_PROC( qglBindTexGenParameterEXT, PFNGLBINDTEXGENPARAMETEREXTPROC, "glBindTexGenParameterEXT");
305 SAFE_GET_PROC( qglBindTextureUnitParameterEXT, PFNGLBINDTEXTUREUNITPARAMETEREXTPROC, "glBindTextureUnitParameterEXT");
306 SAFE_GET_PROC( qglBindParameterEXT, PFNGLBINDPARAMETEREXTPROC, "glBindParameterEXT");
307 SAFE_GET_PROC( qglIsVariantEnabledEXT, PFNGLISVARIANTENABLEDEXTPROC, "glIsVariantEnabledEXT");
308 SAFE_GET_PROC( qglGetVariantBooleanvEXT, PFNGLGETVARIANTBOOLEANVEXTPROC, "glGetVariantBooleanvEXT");
309 SAFE_GET_PROC( qglGetVariantIntegervEXT, PFNGLGETVARIANTINTEGERVEXTPROC, "glGetVariantIntegervEXT");
310 SAFE_GET_PROC( qglGetVariantFloatvEXT, PFNGLGETVARIANTFLOATVEXTPROC, "glGetVariantFloatvEXT");
311 SAFE_GET_PROC( qglGetVariantPointervEXT, PFNGLGETVARIANTPOINTERVEXTPROC, "glGetVariantPointervEXT");
312 SAFE_GET_PROC( qglGetInvariantBooleanvEXT, PFNGLGETINVARIANTBOOLEANVEXTPROC, "glGetInvariantBooleanvEXT");
313 SAFE_GET_PROC( qglGetInvariantIntegervEXT, PFNGLGETINVARIANTINTEGERVEXTPROC, "glGetInvariantIntegervEXT");
314 SAFE_GET_PROC( qglGetInvariantFloatvEXT, PFNGLGETINVARIANTFLOATVEXTPROC, "glGetInvariantFloatvEXT");
315 SAFE_GET_PROC( qglGetLocalConstantBooleanvEXT, PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC, "glGetLocalConstantBooleanvEXT");
316 SAFE_GET_PROC( qglGetLocalConstantIntegervEXT, PFNGLGETLOCALCONSTANTINTEGERVEXTPROC, "glGetLocalConstantIntegervEXT");
317 SAFE_GET_PROC( qglGetLocalConstantFloatvEXT, PFNGLGETLOCALCONSTANTFLOATVEXTPROC, "glGetLocalConstantFloatvEXT");
318
319 SAFE_GET_PROC( qglPNTrianglesiATI, PFNGLPNTRIANGLESIATIPROC, "glPNTrianglesiATI");
320 SAFE_GET_PROC( qglPNTrianglesfATI, PFNGLPNTRIANGLESFATIPROC, "glPNTrianglesfATI");
321 #endif /* !__APPLE__ && !MACOSX */
322
323 glEnable(GL_FRAGMENT_SHADER_ATI);
324
325 fragment_shaders = qglGenFragmentShadersATI(2);
326
327 // combined diffuse & specular shader w/ vertex color
328 qglBindFragmentShaderATI(fragment_shaders);
329 checkerror();
330 qglBeginFragmentShaderATI();
331 checkerror();
332
333 qglSetFragmentShaderConstantATI(GL_CON_0_ATI, &scaler[0]);
334 checkerror();
335
336 // texld r0, t0
337 qglSampleMapATI (GL_REG_0_ATI, GL_TEXTURE0_ARB, GL_SWIZZLE_STR_ATI);
338 checkerror();
339 // texld r1, t1
340 qglSampleMapATI (GL_REG_1_ATI, GL_TEXTURE1_ARB, GL_SWIZZLE_STR_ATI);
341 checkerror();
342 // texld r2, t2
343 qglSampleMapATI (GL_REG_2_ATI, GL_TEXTURE2_ARB, GL_SWIZZLE_STR_ATI);
344 checkerror();
345 // texld r3, t3
346 qglSampleMapATI (GL_REG_3_ATI, GL_TEXTURE3_ARB, GL_SWIZZLE_STR_ATI);
347 checkerror();
348 // texld r4, t4
349 qglSampleMapATI (GL_REG_4_ATI, GL_TEXTURE4_ARB, GL_SWIZZLE_STR_ATI);
350 checkerror();
351
352 // gloss * atten * light color * specular +
353 // dot * color * atten * light color * self shadow =
354 // (gloss * specular + dot * color * self shadow ) * atten * light color
355 // Alpha ops rule :-)
356
357 // dp3_sat r2.rgb, r0_bx2.rgb, r2_bx2.rgb // specular
358 qglColorFragmentOp2ATI(GL_DOT3_ATI,
359 GL_REG_2_ATI, GL_RED_BIT_ATI|GL_GREEN_BIT_ATI|GL_BLUE_BIT_ATI, GL_SATURATE_BIT_ATI,
360 GL_REG_0_ATI, GL_NONE, GL_2X_BIT_ATI|GL_BIAS_BIT_ATI,
361 GL_REG_2_ATI, GL_NONE, GL_2X_BIT_ATI|GL_BIAS_BIT_ATI);
362 checkerror();
363
364 // +mov_x8_sat r2.a, r1_bx2.b // self shadow term
365 qglAlphaFragmentOp1ATI(GL_MOV_ATI,
366 GL_REG_2_ATI, GL_8X_BIT_ATI|GL_SATURATE_BIT_ATI,
367 GL_REG_1_ATI, GL_BLUE, GL_2X_BIT_ATI|GL_BIAS_BIT_ATI);
368 checkerror();
369
370 // dp3_sat r1.rgb, r0_bx2.rgb, r1_bx2.rgb // diffuse
371 qglColorFragmentOp2ATI(GL_DOT3_ATI,
372 GL_REG_1_ATI, GL_RED_BIT_ATI|GL_GREEN_BIT_ATI|GL_BLUE_BIT_ATI, GL_SATURATE_BIT_ATI,
373 GL_REG_0_ATI, GL_NONE, GL_2X_BIT_ATI|GL_BIAS_BIT_ATI,
374 GL_REG_1_ATI, GL_NONE, GL_2X_BIT_ATI|GL_BIAS_BIT_ATI);
375 checkerror();
376
377 // +mad_x2_sat r1.a, r2.b, r2.b, -c0.b // specular exponent
378 qglAlphaFragmentOp3ATI(GL_MAD_ATI,
379 GL_REG_1_ATI, GL_2X_BIT_ATI|GL_SATURATE_BIT_ATI,
380 GL_REG_2_ATI, GL_BLUE, GL_NONE,
381 GL_REG_2_ATI, GL_BLUE, GL_NONE,
382 GL_CON_0_ATI, GL_BLUE, GL_NEGATE_BIT_ATI);
383 checkerror();
384
385 // mul r1.rgb, r1.rgb, r3.rgb // diffuse color * diffuse bump
386 qglColorFragmentOp2ATI(GL_MUL_ATI,
387 GL_REG_1_ATI, GL_RED_BIT_ATI|GL_GREEN_BIT_ATI|GL_BLUE_BIT_ATI, GL_NONE,
388 GL_REG_1_ATI, GL_NONE, GL_NONE,
389 GL_REG_3_ATI, GL_NONE, GL_NONE);
390 checkerror();
391
392 // +mul r1.a, r1.a, r1.a // raise exponent
393 qglAlphaFragmentOp2ATI(GL_MUL_ATI,
394 GL_REG_1_ATI, GL_NONE,
395 GL_REG_1_ATI, GL_NONE, GL_NONE,
396 GL_REG_1_ATI, GL_NONE, GL_NONE);
397 checkerror();
398
399 // mul r4.rgb, r4.rgb, v0.rgb // atten * light color
400 qglColorFragmentOp2ATI(GL_MUL_ATI,
401 GL_REG_4_ATI, GL_RED_BIT_ATI|GL_GREEN_BIT_ATI|GL_BLUE_BIT_ATI, GL_NONE,
402 GL_REG_4_ATI, GL_NONE, GL_NONE,
403 GL_PRIMARY_COLOR_ARB, GL_NONE, GL_NONE);
404 checkerror();
405
406 // +mul r1.a, r1.a, r1.a // raise exponent
407 qglAlphaFragmentOp2ATI(GL_MUL_ATI,
408 GL_REG_1_ATI, GL_NONE,
409 GL_REG_1_ATI, GL_NONE, GL_NONE,
410 GL_REG_1_ATI, GL_NONE, GL_NONE);
411 checkerror();
412
413 // mul r1.rgb, r1.rgb, r2.a // self shadow * diffuse
414 qglColorFragmentOp2ATI(GL_MUL_ATI,
415 GL_REG_1_ATI, GL_RED_BIT_ATI|GL_GREEN_BIT_ATI|GL_BLUE_BIT_ATI, GL_NONE,
416 GL_REG_1_ATI, GL_NONE, GL_NONE,
417 GL_REG_2_ATI, GL_ALPHA, GL_NONE);
418 checkerror();
419
420 // +mul r0.a, r1.a, r0.a // specular * gloss map
421 qglAlphaFragmentOp2ATI(GL_MUL_ATI,
422 GL_REG_0_ATI, GL_SATURATE_BIT_ATI,
423 GL_REG_1_ATI, GL_NONE, GL_NONE,
424 GL_REG_0_ATI, GL_NONE, GL_NONE);
425 checkerror();
426
427 // add r0.rgb, r1.rgb, r0.a // diffuse + specular
428 qglColorFragmentOp2ATI(GL_ADD_ATI,
429 GL_REG_0_ATI, GL_RED_BIT_ATI|GL_GREEN_BIT_ATI|GL_BLUE_BIT_ATI, GL_NONE,
430 GL_REG_1_ATI, GL_NONE, GL_NONE,
431 GL_REG_0_ATI, GL_ALPHA, GL_NONE);
432 checkerror();
433
434 // mul_sat r0.rgb, r0.rgb, r4.rgb // (diffuse + specular)*atten*color
435 qglColorFragmentOp2ATI(GL_MUL_ATI,
436 GL_REG_0_ATI, GL_NONE, GL_SATURATE_BIT_ATI,
437 GL_REG_0_ATI, GL_NONE, GL_NONE,
438 GL_REG_4_ATI, GL_NONE, GL_NONE);
439 checkerror();
440
441
442 qglEndFragmentShaderATI();
443 checkerror();
444
445 // Second shader with cube filter
446 qglBindFragmentShaderATI(fragment_shaders+1);
447 checkerror();
448 qglBeginFragmentShaderATI();
449 checkerror();
450
451 qglSetFragmentShaderConstantATI(GL_CON_0_ATI, &scaler[0]);
452 checkerror();
453
454 // texld r0, t0
455 qglSampleMapATI (GL_REG_0_ATI, GL_TEXTURE0_ARB, GL_SWIZZLE_STR_ATI);
456 checkerror();
457 // texld r1, t1
458 qglSampleMapATI (GL_REG_1_ATI, GL_TEXTURE1_ARB, GL_SWIZZLE_STR_ATI);
459 checkerror();
460 // texld r2, t2
461 qglSampleMapATI (GL_REG_2_ATI, GL_TEXTURE2_ARB, GL_SWIZZLE_STR_ATI);
462 checkerror();
463 // texld r3, t3
464 qglSampleMapATI (GL_REG_3_ATI, GL_TEXTURE3_ARB, GL_SWIZZLE_STR_ATI);
465 checkerror();
466 // texld r4, t4
467 qglSampleMapATI (GL_REG_4_ATI, GL_TEXTURE4_ARB, GL_SWIZZLE_STR_ATI);
468 checkerror();
469 // texld r5, t5
470 qglSampleMapATI (GL_REG_5_ATI, GL_TEXTURE5_ARB, GL_SWIZZLE_STR_ATI);
471 checkerror();
472
473 // gloss * atten * light color * specular +
474 // dot * color * atten * light color * self shadow =
475 // (gloss * specular + dot * color * self shadow ) * atten * light color * filter
476 // Alpha ops rule :-)
477
478 // dp3_sat r2.rgb, r0_bx2.rgb, r2_bx2.rgb // specular
479 qglColorFragmentOp2ATI(GL_DOT3_ATI,
480 GL_REG_2_ATI, GL_RED_BIT_ATI|GL_GREEN_BIT_ATI|GL_BLUE_BIT_ATI, GL_SATURATE_BIT_ATI,
481 GL_REG_0_ATI, GL_NONE, GL_2X_BIT_ATI|GL_BIAS_BIT_ATI,
482 GL_REG_2_ATI, GL_NONE, GL_2X_BIT_ATI|GL_BIAS_BIT_ATI);
483 checkerror();
484
485 // +mov_x8_sat r2.a, r1_bx2.b // self shadow term
486 qglAlphaFragmentOp1ATI(GL_MOV_ATI,
487 GL_REG_2_ATI, GL_8X_BIT_ATI|GL_SATURATE_BIT_ATI,
488 GL_REG_1_ATI, GL_BLUE, GL_2X_BIT_ATI|GL_BIAS_BIT_ATI);
489 checkerror();
490
491 // dp3_sat r1.rgb, r0_bx2.rgb, r1_bx2.rgb // diffuse
492 qglColorFragmentOp2ATI(GL_DOT3_ATI,
493 GL_REG_1_ATI, GL_RED_BIT_ATI|GL_GREEN_BIT_ATI|GL_BLUE_BIT_ATI, GL_SATURATE_BIT_ATI,
494 GL_REG_0_ATI, GL_NONE, GL_2X_BIT_ATI|GL_BIAS_BIT_ATI,
495 GL_REG_1_ATI, GL_NONE, GL_2X_BIT_ATI|GL_BIAS_BIT_ATI);
496 checkerror();
497
498 // +mad_x2_sat r1.a, r2.b, r2.b, -c0.b // specular exponent
499 qglAlphaFragmentOp3ATI(GL_MAD_ATI,
500 GL_REG_1_ATI, GL_2X_BIT_ATI|GL_SATURATE_BIT_ATI,
501 GL_REG_2_ATI, GL_BLUE, GL_NONE,
502 GL_REG_2_ATI, GL_BLUE, GL_NONE,
503 GL_CON_0_ATI, GL_BLUE, GL_NEGATE_BIT_ATI);
504 checkerror();
505
506 // mul r1.rgb, r1.rgb, r3.rgb // diffuse color * diffuse bump
507 qglColorFragmentOp2ATI(GL_MUL_ATI,
508 GL_REG_1_ATI, GL_RED_BIT_ATI|GL_GREEN_BIT_ATI|GL_BLUE_BIT_ATI, GL_NONE,
509 GL_REG_1_ATI, GL_NONE, GL_NONE,
510 GL_REG_3_ATI, GL_NONE, GL_NONE);
511 checkerror();
512
513 // +mul r1.a, r1.a, r1.a // raise exponent
514 qglAlphaFragmentOp2ATI(GL_MUL_ATI,
515 GL_REG_1_ATI, GL_NONE,
516 GL_REG_1_ATI, GL_NONE, GL_NONE,
517 GL_REG_1_ATI, GL_NONE, GL_NONE);
518 checkerror();
519
520 // mul r4.rgb, r4.rgb, v0.rgb // atten * light color
521 qglColorFragmentOp2ATI(GL_MUL_ATI,
522 GL_REG_4_ATI, GL_RED_BIT_ATI|GL_GREEN_BIT_ATI|GL_BLUE_BIT_ATI, GL_NONE,
523 GL_REG_4_ATI, GL_NONE, GL_NONE,
524 GL_PRIMARY_COLOR_ARB, GL_NONE, GL_NONE);
525 checkerror();
526
527 // +mul r1.a, r1.a, r1.a // raise exponent
528 qglAlphaFragmentOp2ATI(GL_MUL_ATI,
529 GL_REG_1_ATI, GL_NONE,
530 GL_REG_1_ATI, GL_NONE, GL_NONE,
531 GL_REG_1_ATI, GL_NONE, GL_NONE);
532 checkerror();
533
534 // mul r1.rgb, r1.rgb, r2.a // self shadow * diffuse
535 qglColorFragmentOp2ATI(GL_MUL_ATI,
536 GL_REG_1_ATI, GL_RED_BIT_ATI|GL_GREEN_BIT_ATI|GL_BLUE_BIT_ATI, GL_NONE,
537 GL_REG_1_ATI, GL_NONE, GL_NONE,
538 GL_REG_2_ATI, GL_ALPHA, GL_NONE);
539 checkerror();
540
541 // +mul r0.a, r1.a, r0.a // specular * gloss map
542 qglAlphaFragmentOp2ATI(GL_MUL_ATI,
543 GL_REG_0_ATI, GL_SATURATE_BIT_ATI,
544 GL_REG_1_ATI, GL_NONE, GL_NONE,
545 GL_REG_0_ATI, GL_NONE, GL_NONE);
546 checkerror();
547
548 // add r0.rgb, r0.rgb, r0.a // diffuse + specular
549 qglColorFragmentOp2ATI(GL_ADD_ATI,
550 GL_REG_0_ATI, GL_RED_BIT_ATI|GL_GREEN_BIT_ATI|GL_BLUE_BIT_ATI, GL_NONE,
551 GL_REG_1_ATI, GL_NONE, GL_NONE,
552 GL_REG_0_ATI, GL_ALPHA, GL_NONE);
553 checkerror();
554
555 // mul r0.rgb, r0.rgb, r4.rgb // (diffuse + specular)*atten*color
556 qglColorFragmentOp2ATI(GL_MUL_ATI,
557 GL_REG_0_ATI, GL_NONE, GL_NONE,
558 GL_REG_0_ATI, GL_NONE, GL_NONE,
559 GL_REG_4_ATI, GL_NONE, GL_NONE);
560 checkerror();
561
562 // mul_sat r0.rgb, r0.rgb, r5.rgb // (diffuse + specular)*atten*color*filter
563 qglColorFragmentOp2ATI(GL_MUL_ATI,
564 GL_REG_0_ATI, GL_NONE, GL_SATURATE_BIT_ATI,
565 GL_REG_0_ATI, GL_NONE, GL_NONE,
566 GL_REG_5_ATI, GL_NONE, GL_NONE);
567 checkerror();
568
569
570 qglEndFragmentShaderATI();
571 checkerror();
572
573 glDisable(GL_FRAGMENT_SHADER_ATI);
574
575
576 glEnable(GL_VERTEX_SHADER_EXT);
577
578 vertex_shaders = qglGenVertexShadersEXT(2);
579 checkerror();
580 qglBindVertexShaderEXT(vertex_shaders);
581 checkerror();
582 qglBeginVertexShaderEXT();
583 checkerror();
584
585 // Generates a necessary input for the diffuse bumpmapping registers
586 mvp = qglBindParameterEXT( GL_MVP_MATRIX_EXT );
587 checkerror();
588 modelview = qglBindParameterEXT( GL_MODELVIEW_MATRIX );
589 checkerror();
590 vertex = qglBindParameterEXT( GL_CURRENT_VERTEX_EXT );
591 checkerror();
592 color = qglBindParameterEXT( GL_CURRENT_COLOR );
593 checkerror();
594 texturematrix = qglBindTextureUnitParameterEXT( GL_TEXTURE4_ARB, GL_TEXTURE_MATRIX );
595 checkerror();
596 texcoord0 = qglBindTextureUnitParameterEXT( GL_TEXTURE0_ARB, GL_CURRENT_TEXTURE_COORDS );
597 checkerror();
598 texcoord1 = qglBindTextureUnitParameterEXT( GL_TEXTURE1_ARB, GL_CURRENT_TEXTURE_COORDS );
599 checkerror();
600 texcoord2 = qglBindTextureUnitParameterEXT( GL_TEXTURE2_ARB, GL_CURRENT_TEXTURE_COORDS );
601 checkerror();
602 disttemp = qglGenSymbolsEXT(GL_SCALAR_EXT, GL_LOCAL_EXT, GL_FULL_RANGE_EXT, 1);
603 checkerror();
604 disttemp2 = qglGenSymbolsEXT(GL_SCALAR_EXT, GL_LOCAL_EXT, GL_FULL_RANGE_EXT, 1);
605 checkerror();
606 zcomp = qglGenSymbolsEXT(GL_VECTOR_EXT, GL_LOCAL_EXT, GL_FULL_RANGE_EXT, 1);
607 checkerror();
608 fogstart = qglBindParameterEXT( GL_FOG_START );
609 checkerror();
610 fogend = qglBindParameterEXT( GL_FOG_END );
611 checkerror();
612
613 // Transform vertex to view-space
614 qglShaderOp2EXT( GL_OP_MULTIPLY_MATRIX_EXT, GL_OUTPUT_VERTEX_EXT, mvp, vertex );
615 checkerror();
616
617 // Transform vertex by texture matrix and copy to output
618 qglShaderOp2EXT( GL_OP_MULTIPLY_MATRIX_EXT, GL_OUTPUT_TEXTURE_COORD4_EXT, texturematrix, vertex );
619 checkerror();
620
621 // copy tex coords of unit 0 to unit 3
622 qglShaderOp1EXT( GL_OP_MOV_EXT, GL_OUTPUT_TEXTURE_COORD0_EXT, texcoord0);
623 checkerror();
624 qglShaderOp1EXT( GL_OP_MOV_EXT, GL_OUTPUT_TEXTURE_COORD1_EXT, texcoord1);
625 checkerror();
626 qglShaderOp1EXT( GL_OP_MOV_EXT, GL_OUTPUT_TEXTURE_COORD2_EXT, texcoord2);
627 checkerror();
628 qglShaderOp1EXT( GL_OP_MOV_EXT, GL_OUTPUT_TEXTURE_COORD3_EXT, texcoord0);
629 checkerror();
630 qglShaderOp1EXT( GL_OP_MOV_EXT, GL_OUTPUT_COLOR0_EXT, color);
631 checkerror();
632
633 // Transform vertex and take z for fog
634 qglExtractComponentEXT( zcomp, modelview, 2);
635 checkerror();
636 qglShaderOp2EXT( GL_OP_DOT4_EXT, disttemp, zcomp, vertex );
637 checkerror();
638
639 // calculate fog values end - z and end - start
640 qglShaderOp2EXT( GL_OP_SUB_EXT, disttemp, fogend, disttemp);
641 checkerror();
642 qglShaderOp2EXT( GL_OP_SUB_EXT, disttemp2, fogend, fogstart);
643 checkerror();
644
645 // divide end - z by end - start, that's it
646 qglShaderOp1EXT( GL_OP_RECIP_EXT, disttemp2, disttemp2);
647 checkerror();
648 qglShaderOp2EXT( GL_OP_MUL_EXT, GL_OUTPUT_FOG_EXT, disttemp, disttemp2);
649 checkerror();
650
651 qglEndVertexShaderEXT();
652 checkerror();
653
654 // Two transformed textures
655 qglBindVertexShaderEXT(vertex_shaders+1);
656 checkerror();
657 qglBeginVertexShaderEXT();
658 checkerror();
659
660 // Generates a necessary input for the diffuse bumpmapping registers
661 mvp = qglBindParameterEXT( GL_MVP_MATRIX_EXT );
662 checkerror();
663 modelview = qglBindParameterEXT( GL_MODELVIEW_MATRIX );
664 checkerror();
665 vertex = qglBindParameterEXT( GL_CURRENT_VERTEX_EXT );
666 checkerror();
667 color = qglBindParameterEXT( GL_CURRENT_COLOR );
668 checkerror();
669 texturematrix = qglBindTextureUnitParameterEXT( GL_TEXTURE4_ARB, GL_TEXTURE_MATRIX );
670 checkerror();
671 texturematrix2 = qglBindTextureUnitParameterEXT( GL_TEXTURE5_ARB, GL_TEXTURE_MATRIX );
672 checkerror();
673 texcoord0 = qglBindTextureUnitParameterEXT( GL_TEXTURE0_ARB, GL_CURRENT_TEXTURE_COORDS );
674 checkerror();
675 texcoord1 = qglBindTextureUnitParameterEXT( GL_TEXTURE1_ARB, GL_CURRENT_TEXTURE_COORDS );
676 checkerror();
677 texcoord2 = qglBindTextureUnitParameterEXT( GL_TEXTURE2_ARB, GL_CURRENT_TEXTURE_COORDS );
678 checkerror();
679 disttemp = qglGenSymbolsEXT(GL_SCALAR_EXT, GL_LOCAL_EXT, GL_FULL_RANGE_EXT, 1);
680 checkerror();
681 disttemp2 = qglGenSymbolsEXT(GL_SCALAR_EXT, GL_LOCAL_EXT, GL_FULL_RANGE_EXT, 1);
682 checkerror();
683 zcomp = qglGenSymbolsEXT(GL_VECTOR_EXT, GL_LOCAL_EXT, GL_FULL_RANGE_EXT, 1);
684 checkerror();
685 fogstart = qglBindParameterEXT( GL_FOG_START );
686 checkerror();
687 fogend = qglBindParameterEXT( GL_FOG_END );
688 checkerror();
689
690 // Transform vertex to view-space
691 qglShaderOp2EXT( GL_OP_MULTIPLY_MATRIX_EXT, GL_OUTPUT_VERTEX_EXT, mvp, vertex );
692 checkerror();
693
694 // Transform vertex by texture matrix and copy to output
695 qglShaderOp2EXT( GL_OP_MULTIPLY_MATRIX_EXT, GL_OUTPUT_TEXTURE_COORD4_EXT, texturematrix, vertex );
696 checkerror();
697
698 // Transform vertex by texture matrix and copy to output
699 qglShaderOp2EXT( GL_OP_MULTIPLY_MATRIX_EXT, GL_OUTPUT_TEXTURE_COORD5_EXT, texturematrix2, vertex );
700 checkerror();
701
702 // copy tex coords of unit 0 to unit 3
703 qglShaderOp1EXT( GL_OP_MOV_EXT, GL_OUTPUT_TEXTURE_COORD0_EXT, texcoord0);
704 checkerror();
705 qglShaderOp1EXT( GL_OP_MOV_EXT, GL_OUTPUT_TEXTURE_COORD1_EXT, texcoord1);
706 checkerror();
707 qglShaderOp1EXT( GL_OP_MOV_EXT, GL_OUTPUT_TEXTURE_COORD2_EXT, texcoord2);
708 checkerror();
709 qglShaderOp1EXT( GL_OP_MOV_EXT, GL_OUTPUT_TEXTURE_COORD3_EXT, texcoord0);
710 checkerror();
711 qglShaderOp1EXT( GL_OP_MOV_EXT, GL_OUTPUT_COLOR0_EXT, color);
712 checkerror();
713
714 // Transform vertex and take z for fog
715 qglExtractComponentEXT( zcomp, modelview, 2);
716 checkerror();
717 qglShaderOp2EXT( GL_OP_DOT4_EXT, disttemp, zcomp, vertex );
718 checkerror();
719
720 // calculate fog values end - z and end - start
721 qglShaderOp2EXT( GL_OP_SUB_EXT, disttemp, fogend, disttemp);
722 checkerror();
723 qglShaderOp2EXT( GL_OP_SUB_EXT, disttemp2, fogend, fogstart);
724 checkerror();
725
726 // divide end - z by end - start, that's it
727 qglShaderOp1EXT( GL_OP_RECIP_EXT, disttemp2, disttemp2);
728 checkerror();
729 qglShaderOp2EXT( GL_OP_MUL_EXT, GL_OUTPUT_FOG_EXT, disttemp, disttemp2);
730 checkerror();
731
732 qglEndVertexShaderEXT();
733 checkerror();
734
735 glDisable(GL_VERTEX_SHADER_EXT);
736 }
737
738
GL_DisableDiffuseShaderRadeon()739 void GL_DisableDiffuseShaderRadeon()
740 {
741 //tex 0 = normal map
742 //tex 1 = normalization cube map (tangent space light vector)
743 //tex 2 = normalization cube map (tangent space half vector)
744 //tex 3 = color map
745 //tex 4 = (attenuation or light filter, depends on light settings)
746
747 glDisable(GL_VERTEX_SHADER_EXT);
748 glDisable(GL_FRAGMENT_SHADER_ATI);
749
750 GL_SelectTexture(GL_TEXTURE1_ARB);
751 glDisable(GL_TEXTURE_CUBE_MAP_ARB);
752
753 GL_SelectTexture(GL_TEXTURE2_ARB);
754 glDisable(GL_TEXTURE_CUBE_MAP_ARB);
755
756 GL_SelectTexture(GL_TEXTURE3_ARB);
757 glDisable(GL_TEXTURE_2D);
758
759 GL_SelectTexture(GL_TEXTURE4_ARB);
760 if (currentshadowlight->filtercube)
761 {
762 glDisable(GL_TEXTURE_CUBE_MAP_ARB);
763 glPopMatrix();
764 GL_SelectTexture(GL_TEXTURE5_ARB);
765 }
766 glDisable(GL_TEXTURE_3D);
767 glPopMatrix();
768 glMatrixMode(GL_MODELVIEW);
769
770 GL_SelectTexture(GL_TEXTURE0_ARB);
771 }
772
GL_EnableDiffuseSpecularShaderRadeon(qboolean world,vec3_t lightOrig)773 void GL_EnableDiffuseSpecularShaderRadeon(qboolean world, vec3_t lightOrig)
774 {
775 float invrad = 1/currentshadowlight->radius;
776
777 //tex 0 = normal map
778 //tex 1 = normalization cube map (tangent space light vector)
779 //tex 2 = normalization cube map (tangent space half vector)
780 //tex 3 = color map
781 //tex 4 = (attenuation or light filter, depends on light settings but the actual
782 // register combiner setup does not change only the bound texture)
783
784 GL_SelectTexture(GL_TEXTURE1_ARB);
785 glEnable(GL_TEXTURE_CUBE_MAP_ARB);
786 glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, normcube_texture_object);
787
788 GL_SelectTexture(GL_TEXTURE2_ARB);
789 glEnable(GL_TEXTURE_CUBE_MAP_ARB);
790 glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, normcube_texture_object);
791
792 GL_SelectTexture(GL_TEXTURE3_ARB);
793 glEnable(GL_TEXTURE_2D);
794
795 glEnable(GL_FRAGMENT_SHADER_ATI);
796 glEnable(GL_VERTEX_SHADER_EXT);
797
798 GL_SelectTexture(GL_TEXTURE4_ARB);
799 glMatrixMode(GL_TEXTURE);
800 glPushMatrix();
801 glLoadIdentity();
802 if (currentshadowlight->filtercube)
803 {
804 glGetError();
805 qglBindFragmentShaderATI( fragment_shaders + 1 );
806 checkerror();
807 qglBindVertexShaderEXT( vertex_shaders + 1);
808 checkerror();
809
810 glEnable(GL_TEXTURE_CUBE_MAP_ARB);
811 glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, currentshadowlight->filtercube);
812 GL_SetupCubeMapMatrix(world);
813
814 GL_SelectTexture(GL_TEXTURE5_ARB);
815 glMatrixMode(GL_TEXTURE);
816 glPushMatrix();
817 glLoadIdentity();
818 }
819 else
820 {
821 glGetError();
822 qglBindFragmentShaderATI( fragment_shaders );
823 checkerror();
824 qglBindVertexShaderEXT( vertex_shaders );
825 checkerror();
826 }
827
828 glEnable(GL_TEXTURE_3D);
829 glBindTexture(GL_TEXTURE_3D, atten3d_texture_object);
830
831 glTranslatef(0.5,0.5,0.5);
832 glScalef(0.5,0.5,0.5);
833 glScalef(invrad, invrad, invrad);
834 glTranslatef(-lightOrig[0], -lightOrig[1], -lightOrig[2]);
835
836 GL_SelectTexture(GL_TEXTURE0_ARB);
837
838 }
839
840
R_DrawWorldRadeonDiffuseSpecular(lightcmd_t * lightCmds)841 void R_DrawWorldRadeonDiffuseSpecular(lightcmd_t *lightCmds)
842 {
843 int command, num, i;
844 int lightPos = 0;
845 vec3_t lightOr;
846 msurface_t *surf;
847 float *v;
848 float* lightP;
849 vec3_t lightDir;
850 vec3_t tsH,H;
851
852 texture_t *t;//XYZ
853
854 //support flickering lights
855 VectorCopy(currentshadowlight->origin,lightOr);
856
857 while (1)
858 {
859 command = lightCmds[lightPos++].asInt;
860 if (command == 0) break; //end of list
861
862 surf = lightCmds[lightPos++].asVoid;
863
864 if (surf->visframe != r_framecount) {
865 lightPos+=(4+surf->polys->numverts*(2+3));
866 continue;
867 }
868
869 num = surf->polys->numverts;
870 lightPos+=4;//skip color
871
872 //XYZ
873 t = R_TextureAnimation (surf->texinfo->texture);
874
875 GL_SelectTexture(GL_TEXTURE0_ARB);
876 GL_Bind(t->gl_texturenum+1);
877 GL_SelectTexture(GL_TEXTURE3_ARB);
878 GL_Bind(t->gl_texturenum);
879
880 glBegin(command);
881 //v = surf->polys->verts[0];
882 v = (float *)(&globalVertexTable[surf->polys->firstvertex]);
883 for (i=0; i<num; i++, v+= VERTEXSIZE)
884 {
885 //skip attent texture coord.
886 lightPos += 2;
887
888 lightP = &lightCmds[lightPos].asFloat;
889 lightPos += 3;
890
891 VectorCopy(lightP, lightDir);
892 VectorNormalize(lightDir);
893
894 //calculate local H vector and put it into tangent space
895
896 //r_origin = camera position
897 VectorSubtract(r_refdef.vieworg,v,H);
898 VectorNormalize(H);
899
900 //put H in tangent space first since lightDir (precalc) is already in tang space
901 if (surf->flags & SURF_PLANEBACK)
902 {
903 tsH[2] = -DotProduct(H,surf->plane->normal);
904 }
905 else
906 {
907 tsH[2] = DotProduct(H,surf->plane->normal);
908 }
909
910 tsH[1] = -DotProduct(H,surf->texinfo->vecs[1]);
911 tsH[0] = DotProduct(H,surf->texinfo->vecs[0]);
912
913 VectorAdd(lightDir,tsH,tsH);
914
915 // diffuse
916 qglMultiTexCoord2fARB(GL_TEXTURE0_ARB, v[3], v[4]);
917
918 qglMultiTexCoord3fvARB(GL_TEXTURE1_ARB, lightP);
919
920 // half vector for specular
921 qglMultiTexCoord3fvARB(GL_TEXTURE2_ARB,&tsH[0]);
922
923 glVertex3fv(&v[0]);
924 }
925 glEnd();
926 }
927
928 GL_SelectTexture(GL_TEXTURE0_ARB);
929 }
930
931
932
R_DrawBrushRadeonDiffuseSpecular(entity_t * e)933 void R_DrawBrushRadeonDiffuseSpecular(entity_t *e)
934 {
935 model_t *model = e->model;
936 msurface_t *surf;
937 glpoly_t *poly;
938 int i, j, count;
939 brushlightinstant_t *ins = e->brushlightinstant;
940 float *v;
941 texture_t *t;//XYZ
942
943 count = 0;
944
945 surf = &model->surfaces[model->firstmodelsurface];
946 for (i=0; i<model->nummodelsurfaces; i++, surf++)
947 {
948 if (!ins->polygonVis[i]) continue;
949
950 poly = surf->polys;
951
952 //XYZ
953 t = R_TextureAnimation (surf->texinfo->texture);
954
955 GL_SelectTexture(GL_TEXTURE0_ARB);
956 GL_Bind(t->gl_texturenum+1);
957 GL_SelectTexture(GL_TEXTURE3_ARB);
958 GL_Bind(t->gl_texturenum);
959
960 glBegin(GL_TRIANGLE_FAN);
961 //v = poly->verts[0];
962 v = (float *)(&globalVertexTable[poly->firstvertex]);
963 for (j=0 ; j<poly->numverts ; j++, v+= VERTEXSIZE)
964 {
965 qglMultiTexCoord2fARB(GL_TEXTURE0_ARB, v[3], v[4]);
966 qglMultiTexCoord3fvARB(GL_TEXTURE1_ARB,&ins->tslights[count+j][0]);
967 qglMultiTexCoord3fvARB(GL_TEXTURE2_ARB,&ins->tshalfangles[count+j][0]);
968 glVertex3fv(v);
969 }
970 glEnd();
971 count+=surf->numedges;
972 }
973 }
974
975
R_DrawAliasFrameRadeonDiffuseSpecular(aliashdr_t * paliashdr,aliasframeinstant_t * instant)976 void R_DrawAliasFrameRadeonDiffuseSpecular (aliashdr_t *paliashdr, aliasframeinstant_t *instant)
977 {
978 mtriangle_t *tris;
979 fstvert_t *texcoords;
980 int anim;
981 int *indecies;
982 aliaslightinstant_t *linstant = instant->lightinstant;
983
984 tris = (mtriangle_t *)((byte *)paliashdr + paliashdr->triangles);
985 texcoords = (fstvert_t *)((byte *)paliashdr + paliashdr->texcoords);
986
987 //bind normal map
988 anim = (int)(cl.time*10) & 3;
989
990 GL_SelectTexture(GL_TEXTURE0_ARB);
991 GL_Bind(paliashdr->gl_texturenum[currententity->skinnum][anim]+1);
992 GL_SelectTexture(GL_TEXTURE3_ARB);
993 GL_Bind(paliashdr->gl_texturenum[currententity->skinnum][anim]);
994
995 indecies = (int *)((byte *)paliashdr + paliashdr->indecies);
996
997 glVertexPointer(3, GL_FLOAT, 0, instant->vertices);
998 glEnableClientState(GL_VERTEX_ARRAY);
999 glNormalPointer(GL_FLOAT, 0, instant->normals);
1000 glEnableClientState(GL_NORMAL_ARRAY);
1001
1002 qglClientActiveTextureARB(GL_TEXTURE0_ARB);
1003 glTexCoordPointer(2, GL_FLOAT, 0, texcoords);
1004 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
1005
1006 qglClientActiveTextureARB(GL_TEXTURE1_ARB);
1007 glTexCoordPointer(3, GL_FLOAT, 0, linstant->tslights);
1008 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
1009
1010 qglClientActiveTextureARB(GL_TEXTURE2_ARB);
1011 glTexCoordPointer(3, GL_FLOAT, 0, linstant->tshalfangles);
1012 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
1013
1014 //glDrawElements(GL_TRIANGLES,paliashdr->numtris*3,GL_UNSIGNED_INT,indecies);
1015 glDrawElements(GL_TRIANGLES,linstant->numtris*3,GL_UNSIGNED_INT,&linstant->indecies[0]);
1016
1017 glDisableClientState(GL_VERTEX_ARRAY);
1018 glDisableClientState(GL_NORMAL_ARRAY);
1019 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
1020 qglClientActiveTextureARB(GL_TEXTURE0_ARB);
1021 GL_SelectTexture(GL_TEXTURE0_ARB);
1022 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
1023 }
1024
R_DrawWorldBumpedRadeon()1025 void R_DrawWorldBumpedRadeon()
1026 {
1027 if (!currentshadowlight->visible)
1028 return;
1029
1030 glDepthMask (0);
1031 glShadeModel (GL_SMOOTH);
1032 GL_AddColor();
1033 glColor3fv(¤tshadowlight->color[0]);
1034
1035 GL_EnableDiffuseSpecularShaderRadeon(true,currentshadowlight->origin);
1036 R_DrawWorldRadeonDiffuseSpecular(currentshadowlight->lightCmds);
1037 GL_DisableDiffuseShaderRadeon();
1038
1039 glColor3f (1,1,1);
1040 glDisable (GL_BLEND);
1041 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1042 glDepthMask (1);
1043 }
1044
R_DrawBrushBumpedRadeon(entity_t * e)1045 void R_DrawBrushBumpedRadeon(entity_t *e)
1046 {
1047 GL_AddColor();
1048 glColor3fv(¤tshadowlight->color[0]);
1049
1050
1051 GL_EnableDiffuseSpecularShaderRadeon(false,((brushlightinstant_t *)e->brushlightinstant)->lightpos);
1052 R_DrawBrushRadeonDiffuseSpecular(e);
1053 GL_DisableDiffuseShaderRadeon();
1054 }
1055
R_DrawAliasBumpedRadeon(aliashdr_t * paliashdr,aliasframeinstant_t * instant)1056 void R_DrawAliasBumpedRadeon(aliashdr_t *paliashdr, aliasframeinstant_t *instant)
1057 {
1058 if ( gl_truform.value )
1059 {
1060 glEnable(GL_PN_TRIANGLES_ATI);
1061 qglPNTrianglesiATI(GL_PN_TRIANGLES_POINT_MODE_ATI, GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI);
1062 qglPNTrianglesiATI(GL_PN_TRIANGLES_NORMAL_MODE_ATI, GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI);
1063 qglPNTrianglesiATI(GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI, gl_truform_tesselation.value);
1064 }
1065
1066 GL_AddColor();
1067 glColor3fv(¤tshadowlight->color[0]);
1068
1069 GL_EnableDiffuseSpecularShaderRadeon(false,instant->lightinstant->lightpos);
1070 R_DrawAliasFrameRadeonDiffuseSpecular(paliashdr,instant);
1071 GL_DisableDiffuseShaderRadeon();
1072
1073 if ( gl_truform.value )
1074 {
1075 glDisable(GL_PN_TRIANGLES_ATI);
1076 }
1077 }
1078