1 /*
2 Copyright (C) 2001-2002 Charles Hollemeersch
3 ARB_fragment_progam 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 9700 / NV30 optimized
23 These routines require 6 texture units, vertex shader and pixel shader
24 
25 All lights require 1 pass:
26 1 diffuse + specular with optional light filter
27 
28 */
29 
30 #include "quakedef.h"
31 
32 #ifndef GL_ATI_pn_triangles
33 // PN_triangles_ATI
34 #define GL_PN_TRIANGLES_ATI                       0x87F0
35 #define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1
36 #define GL_PN_TRIANGLES_POINT_MODE_ATI            0x87F2
37 #define GL_PN_TRIANGLES_NORMAL_MODE_ATI           0x87F3
38 #define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI     0x87F4
39 #define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI     0x87F5
40 #define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI      0x87F6
41 #define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI    0x87F7
42 #define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8
43 
44 typedef void (APIENTRY *PFNGLPNTRIANGLESIATIPROC)(GLenum pname, GLint param);
45 typedef void (APIENTRY *PFNGLPNTRIANGLESFATIPROC)(GLenum pname, GLfloat param);
46 #endif
47 
48 // actually in gl_bumpradeon (duh...)
49 extern PFNGLPNTRIANGLESIATIPROC qglPNTrianglesiATI;
50 extern PFNGLPNTRIANGLESFATIPROC qglPNTrianglesfATI;
51 
52 
53 // ARB_vertex_program
54 
55 typedef void (APIENTRY * glVertexAttrib1sARBPROC) (GLuint index, GLshort x);
56 typedef void (APIENTRY * glVertexAttrib1fARBPROC) (GLuint index, GLfloat x);
57 typedef void (APIENTRY * glVertexAttrib1dARBPROC) (GLuint index, GLdouble x);
58 typedef void (APIENTRY * glVertexAttrib2sARBPROC) (GLuint index, GLshort x, GLshort y);
59 typedef void (APIENTRY * glVertexAttrib2fARBPROC) (GLuint index, GLfloat x, GLfloat y);
60 typedef void (APIENTRY * glVertexAttrib2dARBPROC) (GLuint index, GLdouble x, GLdouble y);
61 typedef void (APIENTRY * glVertexAttrib3sARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z);
62 typedef void (APIENTRY * glVertexAttrib3fARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
63 typedef void (APIENTRY * glVertexAttrib3dARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
64 typedef void (APIENTRY * glVertexAttrib4sARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
65 typedef void (APIENTRY * glVertexAttrib4fARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
66 typedef void (APIENTRY * glVertexAttrib4dARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
67 typedef void (APIENTRY * glVertexAttrib4NubARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
68 typedef void (APIENTRY * glVertexAttrib1svARBPROC) (GLuint index, const GLshort *v);
69 typedef void (APIENTRY * glVertexAttrib1fvARBPROC) (GLuint index, const GLfloat *v);
70 typedef void (APIENTRY * glVertexAttrib1dvARBPROC) (GLuint index, const GLdouble *v);
71 typedef void (APIENTRY * glVertexAttrib2svARBPROC) (GLuint index, const GLshort *v);
72 typedef void (APIENTRY * glVertexAttrib2fvARBPROC) (GLuint index, const GLfloat *v);
73 typedef void (APIENTRY * glVertexAttrib2dvARBPROC) (GLuint index, const GLdouble *v);
74 typedef void (APIENTRY * glVertexAttrib3svARBPROC) (GLuint index, const GLshort *v);
75 typedef void (APIENTRY * glVertexAttrib3fvARBPROC) (GLuint index, const GLfloat *v);
76 typedef void (APIENTRY * glVertexAttrib3dvARBPROC) (GLuint index, const GLdouble *v);
77 typedef void (APIENTRY * glVertexAttrib4bvARBPROC) (GLuint index, const GLbyte *v);
78 typedef void (APIENTRY * glVertexAttrib4svARBPROC) (GLuint index, const GLshort *v);
79 typedef void (APIENTRY * glVertexAttrib4ivARBPROC) (GLuint index, const GLint *v);
80 typedef void (APIENTRY * glVertexAttrib4ubvARBPROC) (GLuint index, const GLubyte *v);
81 typedef void (APIENTRY * glVertexAttrib4usvARBPROC) (GLuint index, const GLushort *v);
82 typedef void (APIENTRY * glVertexAttrib4uivARBPROC) (GLuint index, const GLuint *v);
83 typedef void (APIENTRY * glVertexAttrib4fvARBPROC) (GLuint index, const GLfloat *v);
84 typedef void (APIENTRY * glVertexAttrib4dvARBPROC) (GLuint index, const GLdouble *v);
85 typedef void (APIENTRY * glVertexAttrib4NbvARBPROC) (GLuint index, const GLbyte *v);
86 typedef void (APIENTRY * glVertexAttrib4NsvARBPROC) (GLuint index, const GLshort *v);
87 typedef void (APIENTRY * glVertexAttrib4NivARBPROC) (GLuint index, const GLint *v);
88 typedef void (APIENTRY * glVertexAttrib4NubvARBPROC) (GLuint index, const GLubyte *v);
89 typedef void (APIENTRY * glVertexAttrib4NusvARBPROC) (GLuint index, const GLushort *v);
90 typedef void (APIENTRY * glVertexAttrib4NuivARBPROC) (GLuint index, const GLuint *v);
91 typedef void (APIENTRY * glVertexAttribPointerARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
92 typedef void (APIENTRY * glEnableVertexAttribArrayARBPROC) (GLuint index);
93 typedef void (APIENTRY * glDisableVertexAttribArrayARBPROC) (GLuint index);
94 typedef void (APIENTRY * glProgramStringARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string);
95 typedef void (APIENTRY * glBindProgramARBPROC) (GLenum target, GLuint program);
96 typedef void (APIENTRY * glDeleteProgramsARBPROC) (GLsizei n, const GLuint *programs);
97 typedef void (APIENTRY * glGenProgramsARBPROC) (GLsizei n, GLuint *programs);
98 typedef void (APIENTRY * glProgramEnvParameter4dARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
99 typedef void (APIENTRY * glProgramEnvParameter4dvARBPROC) (GLenum target, GLuint index, const GLdouble *params);
100 typedef void (APIENTRY * glProgramEnvParameter4fARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
101 typedef void (APIENTRY * glProgramEnvParameter4fvARBPROC) (GLenum target, GLuint index, const GLfloat *params);
102 typedef void (APIENTRY * glProgramLocalParameter4dARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
103 typedef void (APIENTRY * glProgramLocalParameter4dvARBPROC) (GLenum target, GLuint index, const GLdouble *params);
104 typedef void (APIENTRY * glProgramLocalParameter4fARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
105 typedef void (APIENTRY * glProgramLocalParameter4fvARBPROC) (GLenum target, GLuint index, const GLfloat *params);
106 typedef void (APIENTRY * glGetProgramEnvParameterdvARBPROC) (GLenum target, GLuint index, GLdouble *params);
107 typedef void (APIENTRY * glGetProgramEnvParameterfvARBPROC) (GLenum target, GLuint index, GLfloat *params);
108 typedef void (APIENTRY * glGetProgramLocalParameterdvARBPROC) (GLenum target, GLuint index, GLdouble *params);
109 typedef void (APIENTRY * glGetProgramLocalParameterfvARBPROC) (GLenum target, GLuint index, GLfloat *params);
110 typedef void (APIENTRY * glGetProgramivARBPROC) (GLenum target, GLenum pname, GLint *params);
111 typedef void (APIENTRY * glGetProgramStringARBPROC) (GLenum target, GLenum pname, GLvoid *string);
112 typedef void (APIENTRY * glGetVertexAttribdvARBPROC) (GLuint index, GLenum pname, GLdouble *params);
113 typedef void (APIENTRY * glGetVertexAttribfvARBPROC) (GLuint index, GLenum pname, GLfloat *params);
114 typedef void (APIENTRY * glGetVertexAttribivARBPROC) (GLuint index, GLenum pname, GLint *params);
115 typedef void (APIENTRY * glGetVertexAttribPointervARBPROC) (GLuint index, GLenum pname, GLvoid **pointer);
116 typedef GLboolean (APIENTRY * glIsProgramARBPROC) (GLuint program);
117 
118 static glVertexAttrib1sARBPROC qglVertexAttrib1sARB = NULL;
119 static glVertexAttrib1fARBPROC qglVertexAttrib1fARB = NULL;
120 static glVertexAttrib1dARBPROC qglVertexAttrib1dARB = NULL;
121 static glVertexAttrib2sARBPROC qglVertexAttrib2sARB = NULL;
122 static glVertexAttrib2fARBPROC qglVertexAttrib2fARB = NULL;
123 static glVertexAttrib2dARBPROC qglVertexAttrib2dARB = NULL;
124 static glVertexAttrib3sARBPROC qglVertexAttrib3sARB = NULL;
125 static glVertexAttrib3fARBPROC qglVertexAttrib3fARB = NULL;
126 static glVertexAttrib3dARBPROC qglVertexAttrib3dARB = NULL;
127 static glVertexAttrib4sARBPROC qglVertexAttrib4sARB = NULL;
128 static glVertexAttrib4fARBPROC qglVertexAttrib4fARB = NULL;
129 static glVertexAttrib4dARBPROC qglVertexAttrib4dARB = NULL;
130 static glVertexAttrib4NubARBPROC qglVertexAttrib4NubARB = NULL;
131 static glVertexAttrib1svARBPROC qglVertexAttrib1svARB = NULL;
132 static glVertexAttrib1fvARBPROC qglVertexAttrib1fvARB = NULL;
133 static glVertexAttrib1dvARBPROC qglVertexAttrib1dvARB = NULL;
134 static glVertexAttrib2svARBPROC qglVertexAttrib2svARB = NULL;
135 static glVertexAttrib2fvARBPROC qglVertexAttrib2fvARB = NULL;
136 static glVertexAttrib2dvARBPROC qglVertexAttrib2dvARB = NULL;
137 static glVertexAttrib3svARBPROC qglVertexAttrib3svARB = NULL;
138 static glVertexAttrib3fvARBPROC qglVertexAttrib3fvARB = NULL;
139 static glVertexAttrib3dvARBPROC qglVertexAttrib3dvARB = NULL;
140 static glVertexAttrib4bvARBPROC qglVertexAttrib4bvARB = NULL;
141 static glVertexAttrib4svARBPROC qglVertexAttrib4svARB = NULL;
142 static glVertexAttrib4ivARBPROC qglVertexAttrib4ivARB = NULL;
143 static glVertexAttrib4ubvARBPROC qglVertexAttrib4ubvARB = NULL;
144 static glVertexAttrib4usvARBPROC qglVertexAttrib4usvARB = NULL;
145 static glVertexAttrib4uivARBPROC qglVertexAttrib4uivARB = NULL;
146 static glVertexAttrib4fvARBPROC qglVertexAttrib4fvARB = NULL;
147 static glVertexAttrib4dvARBPROC qglVertexAttrib4dvARB = NULL;
148 static glVertexAttrib4NbvARBPROC qglVertexAttrib4NbvARB = NULL;
149 static glVertexAttrib4NsvARBPROC qglVertexAttrib4NsvARB = NULL;
150 static glVertexAttrib4NivARBPROC qglVertexAttrib4NivARB = NULL;
151 static glVertexAttrib4NubvARBPROC qglVertexAttrib4NubvARB = NULL;
152 static glVertexAttrib4NusvARBPROC qglVertexAttrib4NusvARB = NULL;
153 static glVertexAttrib4NuivARBPROC qglVertexAttrib4NuivARB = NULL;
154 static glVertexAttribPointerARBPROC qglVertexAttribPointerARB = NULL;
155 static glEnableVertexAttribArrayARBPROC qglEnableVertexAttribArrayARB = NULL;
156 static glDisableVertexAttribArrayARBPROC qglDisableVertexAttribArrayARB = NULL;
157 static glProgramStringARBPROC qglProgramStringARB = NULL;
158 static glBindProgramARBPROC qglBindProgramARB = NULL;
159 static glDeleteProgramsARBPROC qglDeleteProgramsARB = NULL;
160 static glGenProgramsARBPROC qglGenProgramsARB = NULL;
161 static glProgramEnvParameter4dARBPROC qglProgramEnvParameter4dARB = NULL;
162 static glProgramEnvParameter4dvARBPROC qglProgramEnvParameter4dvARB = NULL;
163 static glProgramEnvParameter4fARBPROC qglProgramEnvParameter4fARB = NULL;
164 static glProgramEnvParameter4fvARBPROC qglProgramEnvParameter4fvARB = NULL;
165 static glProgramLocalParameter4dARBPROC qglProgramLocalParameter4dARB = NULL;
166 static glProgramLocalParameter4dvARBPROC qglProgramLocalParameter4dvARB = NULL;
167 static glProgramLocalParameter4fARBPROC qglProgramLocalParameter4fARB = NULL;
168 static glProgramLocalParameter4fvARBPROC qglProgramLocalParameter4fvARB = NULL;
169 static glGetProgramEnvParameterdvARBPROC qglGetProgramEnvParameterdvARB = NULL;
170 static glGetProgramEnvParameterfvARBPROC qglGetProgramEnvParameterfvARB = NULL;
171 static glGetProgramLocalParameterdvARBPROC qglGetProgramLocalParameterdvARB = NULL;
172 static glGetProgramLocalParameterfvARBPROC qglGetProgramLocalParameterfvARB = NULL;
173 static glGetProgramivARBPROC qglGetProgramivARB = NULL;
174 static glGetProgramStringARBPROC qglGetProgramStringARB = NULL;
175 static glGetVertexAttribdvARBPROC qglGetVertexAttribdvARB = NULL;
176 static glGetVertexAttribfvARBPROC qglGetVertexAttribfvARB = NULL;
177 static glGetVertexAttribivARBPROC qglGetVertexAttribivARB = NULL;
178 static glGetVertexAttribPointervARBPROC qglGetVertexAttribPointervARB = NULL;
179 static glIsProgramARBPROC qglIsProgramARB = NULL;
180 
181 #define GL_VERTEX_PROGRAM_ARB                                   0x8620
182 #define GL_VERTEX_PROGRAM_POINT_SIZE_ARB                        0x8642
183 #define GL_VERTEX_PROGRAM_TWO_SIDE_ARB                          0x8643
184 #define GL_COLOR_SUM_ARB                                        0x8458
185 #define GL_PROGRAM_FORMAT_ASCII_ARB                             0x8875
186 #define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB                      0x8622
187 #define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB                         0x8623
188 #define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB                       0x8624
189 #define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB                         0x8625
190 #define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB                   0x886A
191 #define GL_CURRENT_VERTEX_ATTRIB_ARB                            0x8626
192 #define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB                      0x8645
193 #define GL_PROGRAM_LENGTH_ARB                                   0x8627
194 #define GL_PROGRAM_FORMAT_ARB                                   0x8876
195 #define GL_PROGRAM_BINDING_ARB                                  0x8677
196 #define GL_PROGRAM_INSTRUCTIONS_ARB                             0x88A0
197 #define GL_MAX_PROGRAM_INSTRUCTIONS_ARB                         0x88A1
198 #define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB                      0x88A2
199 #define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB                  0x88A3
200 #define GL_PROGRAM_TEMPORARIES_ARB                              0x88A4
201 #define GL_MAX_PROGRAM_TEMPORARIES_ARB                          0x88A5
202 #define GL_PROGRAM_NATIVE_TEMPORARIES_ARB                       0x88A6
203 #define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB                   0x88A7
204 #define GL_PROGRAM_PARAMETERS_ARB                               0x88A8
205 #define GL_MAX_PROGRAM_PARAMETERS_ARB                           0x88A9
206 #define GL_PROGRAM_NATIVE_PARAMETERS_ARB                        0x88AA
207 #define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB                    0x88AB
208 #define GL_PROGRAM_ATTRIBS_ARB                                  0x88AC
209 #define GL_MAX_PROGRAM_ATTRIBS_ARB                              0x88AD
210 #define GL_PROGRAM_NATIVE_ATTRIBS_ARB                           0x88AE
211 #define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB                       0x88AF
212 #define GL_PROGRAM_ADDRESS_REGISTERS_ARB                        0x88B0
213 #define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB                    0x88B1
214 #define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB                 0x88B2
215 #define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB             0x88B3
216 #define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB                     0x88B4
217 #define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB                       0x88B5
218 #define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB                      0x88B6
219 #define GL_PROGRAM_STRING_ARB                                   0x8628
220 #define GL_PROGRAM_ERROR_POSITION_ARB                           0x864B
221 #define GL_CURRENT_MATRIX_ARB                                   0x8641
222 #define GL_TRANSPOSE_CURRENT_MATRIX_ARB                         0x88B7
223 #define GL_CURRENT_MATRIX_STACK_DEPTH_ARB                       0x8640
224 #define GL_MAX_VERTEX_ATTRIBS_ARB                               0x8869
225 #define GL_MAX_PROGRAM_MATRICES_ARB                             0x862F
226 #define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB                   0x862E
227 #define GL_PROGRAM_ERROR_STRING_ARB                             0x8874
228 #define GL_MATRIX0_ARB                                          0x88C0
229 #define GL_MATRIX1_ARB                                          0x88C1
230 #define GL_MATRIX2_ARB                                          0x88C2
231 #define GL_MATRIX3_ARB                                          0x88C3
232 #define GL_MATRIX4_ARB                                          0x88C4
233 #define GL_MATRIX5_ARB                                          0x88C5
234 #define GL_MATRIX6_ARB                                          0x88C6
235 #define GL_MATRIX7_ARB                                          0x88C7
236 #define GL_MATRIX8_ARB                                          0x88C8
237 #define GL_MATRIX9_ARB                                          0x88C9
238 #define GL_MATRIX10_ARB                                         0x88CA
239 #define GL_MATRIX11_ARB                                         0x88CB
240 #define GL_MATRIX12_ARB                                         0x88CC
241 #define GL_MATRIX13_ARB                                         0x88CD
242 #define GL_MATRIX14_ARB                                         0x88CE
243 #define GL_MATRIX15_ARB                                         0x88CF
244 #define GL_MATRIX16_ARB                                         0x88D0
245 #define GL_MATRIX17_ARB                                         0x88D1
246 #define GL_MATRIX18_ARB                                         0x88D2
247 #define GL_MATRIX19_ARB                                         0x88D3
248 #define GL_MATRIX20_ARB                                         0x88D4
249 #define GL_MATRIX21_ARB                                         0x88D5
250 #define GL_MATRIX22_ARB                                         0x88D6
251 #define GL_MATRIX23_ARB                                         0x88D7
252 #define GL_MATRIX24_ARB                                         0x88D8
253 #define GL_MATRIX25_ARB                                         0x88D9
254 #define GL_MATRIX26_ARB                                         0x88DA
255 #define GL_MATRIX27_ARB                                         0x88DB
256 #define GL_MATRIX28_ARB                                         0x88DC
257 #define GL_MATRIX29_ARB                                         0x88DD
258 #define GL_MATRIX30_ARB                                         0x88DE
259 #define GL_MATRIX31_ARB                                         0x88DF
260 
261 // ARB_fragment_program
262 #define GL_FRAGMENT_PROGRAM_ARB                                 0x8804
263 
264 static char vertexprogram[] =
265 "!!ARBvp1.0\n"
266 "OPTION ARB_position_invariant;\n"
267 "ATTRIB iPos         = vertex.position;\n"
268 "ATTRIB iNormal      = vertex.normal;\n"
269 "ATTRIB iColor       = vertex.color;\n"
270 "ATTRIB iTex0        = vertex.texcoord[0];\n"
271 "ATTRIB iTex1        = vertex.texcoord[1];\n"
272 "ATTRIB iTex2        = vertex.texcoord[2];\n"
273 "PARAM  mvp[4]       = { state.matrix.mvp };\n"
274 "PARAM  modelview    = state.matrix.mvp.row[2];\n"
275 "PARAM  texMatrix[4] = { state.matrix.texture[2] };\n"
276 "PARAM  fogparams    = state.fog.params;\n"
277 "TEMP   disttemp;\n"
278 "OUTPUT oColor       = result.color;\n"
279 "OUTPUT oTex0        = result.texcoord[0];\n"
280 "OUTPUT oTex1        = result.texcoord[1];\n"
281 "OUTPUT oTex2        = result.texcoord[2];\n"
282 "OUTPUT oTex3        = result.texcoord[3];\n"
283 "OUTPUT oFog         = result.fogcoord;\n"
284 "DP4   oTex3.x, texMatrix[0], iPos;\n"
285 "DP4   oTex3.y, texMatrix[1], iPos;\n"
286 "DP4   oTex3.z, texMatrix[2], iPos;\n"
287 "DP4   oTex3.w, texMatrix[3], iPos;\n"
288 "MOV   oTex0, iTex0;\n"
289 "MOV   oTex1, iTex1;\n"
290 "MOV   oTex2, iTex2;\n"
291 "MOV   oColor, iColor;\n"
292 "DP4   disttemp.x, modelview, iPos;\n"
293 "SUB   disttemp.x, fogparams.z, disttemp.x;\n"
294 "MUL   oFog.x, disttemp.x, fogparams.w;\n"
295 "END";
296 
297 static char vertexprogram2[] =
298 "!!ARBvp1.0\n"
299 "OPTION ARB_position_invariant;\n"
300 "ATTRIB iPos         = vertex.position;\n"
301 "ATTRIB iNormal      = vertex.normal;\n"
302 "ATTRIB iColor       = vertex.color;\n"
303 "ATTRIB iTex0        = vertex.texcoord[0];\n"
304 "ATTRIB iTex1        = vertex.texcoord[1];\n"
305 "ATTRIB iTex2        = vertex.texcoord[2];\n"
306 "PARAM  mvp[4]       = { state.matrix.mvp };\n"
307 "PARAM  modelview    = state.matrix.mvp.row[2];\n"
308 "PARAM  texMatrix[4] = { state.matrix.texture[2] };\n"
309 "PARAM  texMatrix2[4]= { state.matrix.texture[3] };\n"
310 "PARAM  fogparams    = state.fog.params;\n"
311 "TEMP   disttemp;\n"
312 "OUTPUT oColor       = result.color;\n"
313 "OUTPUT oTex0        = result.texcoord[0];\n"
314 "OUTPUT oTex1        = result.texcoord[1];\n"
315 "OUTPUT oTex2        = result.texcoord[2];\n"
316 "OUTPUT oTex3        = result.texcoord[3];\n"
317 "OUTPUT oTex4        = result.texcoord[4];\n"
318 "OUTPUT oFog         = result.fogcoord;\n"
319 "DP4   oTex3.x, texMatrix[0], iPos;\n"
320 "DP4   oTex3.y, texMatrix[1], iPos;\n"
321 "DP4   oTex3.z, texMatrix[2], iPos;\n"
322 "DP4   oTex3.w, texMatrix[3], iPos;\n"
323 "DP4   oTex4.x, texMatrix2[0], iPos;\n"
324 "DP4   oTex4.y, texMatrix2[1], iPos;\n"
325 "DP4   oTex4.z, texMatrix2[2], iPos;\n"
326 "DP4   oTex4.w, texMatrix2[3], iPos;\n"
327 "MOV   oTex0, iTex0;\n"
328 "MOV   oTex1, iTex1;\n"
329 "MOV   oTex2, iTex2;\n"
330 "MOV   oColor, iColor;\n"
331 "DP4   disttemp.x, modelview, iPos;\n"
332 "SUB   disttemp.x, fogparams.z, disttemp.x;\n"
333 "MUL   oFog.x, disttemp.x, fogparams.w;\n"
334 "END";
335 
336 static char fragmentprogram[] =
337 "!!ARBfp1.0\n"
338 "OPTION ARB_precision_hint_fastest;\n"
339 "ATTRIB tex0 = fragment.texcoord[0];\n"
340 "ATTRIB tex1 = fragment.texcoord[1];\n"
341 "ATTRIB tex2 = fragment.texcoord[2];\n"
342 "ATTRIB tex3 = fragment.texcoord[3];\n"
343 "ATTRIB col = fragment.color.primary;\n"
344 "ATTRIB fogCoord = fragment.fogcoord;\n"
345 "PARAM fogcolor = state.fog.color;\n"
346 "PARAM scaler = { 16, 8, 2, -1 };\n"
347 "OUTPUT outColor = result.color;\n"
348 "TEMP normalmap, lightvec, halfvec, colormap, atten;\n"
349 "TEMP diffdot, specdot, selfshadow;\n"
350 "TEX normalmap, tex0, texture[0], 2D;\n"
351 "MAD normalmap.rgb, normalmap, scaler.b, scaler.a;\n"
352 "DP3 lightvec.x, tex1, tex1;\n"
353 "RSQ lightvec.x, lightvec.x;\n"
354 "MUL lightvec, tex1, lightvec.x;\n"
355 "TEX colormap, tex0, texture[1], 2D;\n"
356 "DP3 halfvec.x, tex2, tex2;\n"
357 "RSQ halfvec.x, halfvec.x;\n"
358 "MUL halfvec, tex2, halfvec.x;\n"
359 "TEX atten, tex3, texture[2], 3D;\n"
360 "DP3_SAT diffdot, normalmap, lightvec;\n"
361 "MUL_SAT selfshadow.r, lightvec.z, scaler.g;\n"
362 "DP3_SAT specdot.a, normalmap, halfvec;\n"
363 "MUL diffdot, diffdot, colormap;\n"
364 "POW specdot.a, specdot.a, scaler.r;\n"
365 "MUL specdot.a, specdot.a, normalmap.a;\n"
366 "MAD diffdot, diffdot, selfshadow.r, specdot.a;\n"
367 "MUL atten, col, atten;\n"
368 "MUL_SAT diffdot, diffdot, atten;\n"
369 "LRP outColor, fogCoord.x, diffdot, fogcolor;\n"
370 "END";
371 
372 static char fragmentprogram2[] =
373 "!!ARBfp1.0\n"
374 "OPTION ARB_precision_hint_fastest;\n"
375 "ATTRIB tex0 = fragment.texcoord[0];\n"
376 "ATTRIB tex1 = fragment.texcoord[1];\n"
377 "ATTRIB tex2 = fragment.texcoord[2];\n"
378 "ATTRIB tex3 = fragment.texcoord[3];\n"
379 "ATTRIB tex4 = fragment.texcoord[4];\n"
380 "ATTRIB col = fragment.color.primary;\n"
381 "ATTRIB fogCoord = fragment.fogcoord;\n"
382 "PARAM fogcolor = state.fog.color;\n"
383 "PARAM scaler = { 16, 8, 2, -1 };\n"
384 "OUTPUT outColor = result.color;\n"
385 "TEMP normalmap, lightvec, halfvec, colormap, atten;\n"
386 "TEMP diffdot, specdot, selfshadow, filter;\n"
387 "TEX normalmap, tex0, texture[0], 2D;\n"
388 "MAD normalmap.rgb, normalmap, scaler.b, scaler.a;\n"
389 "DP3 lightvec.x, tex1, tex1;\n"
390 "RSQ lightvec.x, lightvec.x;\n"
391 "MUL lightvec, tex1, lightvec.x;\n"
392 "TEX colormap, tex0, texture[1], 2D;\n"
393 "DP3 halfvec.x, tex2, tex2;\n"
394 "RSQ halfvec.x, halfvec.x;\n"
395 "MUL halfvec, tex2, halfvec.x;\n"
396 "TEX atten, tex3, texture[2], 3D;\n"
397 "DP3_SAT diffdot, normalmap, lightvec;\n"
398 "MUL_SAT selfshadow.r, lightvec.z, scaler.g;\n"
399 "DP3_SAT specdot.a, normalmap, halfvec;\n"
400 "MUL diffdot, diffdot, colormap;\n"
401 "POW specdot.a, specdot.a, scaler.r;\n"
402 "TEX filter, tex4, texture[3], CUBE;\n"
403 "MUL specdot.a, specdot.a, normalmap.a;\n"
404 "MUL atten, atten, filter;\n"
405 "MAD diffdot, diffdot, selfshadow.r, specdot.a;\n"
406 "MUL atten, col, atten;\n"
407 "MUL_SAT diffdot, diffdot, atten;\n"
408 "LRP outColor, fogCoord.x, diffdot, fogcolor;\n"
409 "END";
410 
411 static GLuint fragment_programs[2];
412 static GLuint vertex_programs[2];
413 
414 
415 //#define ARBDEBUG
416 
417 #if defined(ARBDEBUG) && defined(_WIN32)
checkerror()418 static void checkerror()
419 {
420     GLuint error = glGetError();
421     if ( error != GL_NO_ERROR )
422     {
423         int line;
424         const char* err;
425 
426         glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &line);
427         err = glGetString(GL_PROGRAM_ERROR_STRING_ARB);
428         _asm { int 3 };
429     }
430 }
431 #else
432 
433 #define checkerror() do { } while(0)
434 
435 #endif
436 
437 
GL_CreateShadersARB()438 void GL_CreateShadersARB()
439 {
440     float scaler[4] = {0.5f, 0.5f, 0.5f, 0.5f};
441 
442 #if !defined(__APPLE__) && !defined (MACOSX)
443     SAFE_GET_PROC(qglVertexAttrib1sARB,glVertexAttrib1sARBPROC,"glVertexAttrib1sARB");
444     SAFE_GET_PROC(qglVertexAttrib1fARB,glVertexAttrib1fARBPROC,"glVertexAttrib1fARB");
445     SAFE_GET_PROC(qglVertexAttrib1dARB,glVertexAttrib1dARBPROC,"glVertexAttrib1dARB");
446     SAFE_GET_PROC(qglVertexAttrib2sARB,glVertexAttrib2sARBPROC,"glVertexAttrib2sARB");
447     SAFE_GET_PROC(qglVertexAttrib2fARB,glVertexAttrib2fARBPROC,"glVertexAttrib2fARB");
448     SAFE_GET_PROC(qglVertexAttrib2dARB,glVertexAttrib2dARBPROC,"glVertexAttrib2dARB");
449     SAFE_GET_PROC(qglVertexAttrib3sARB,glVertexAttrib3sARBPROC,"glVertexAttrib3sARB");
450     SAFE_GET_PROC(qglVertexAttrib3fARB,glVertexAttrib3fARBPROC,"glVertexAttrib3fARB");
451     SAFE_GET_PROC(qglVertexAttrib3dARB,glVertexAttrib3dARBPROC,"glVertexAttrib3dARB");
452     SAFE_GET_PROC(qglVertexAttrib4sARB,glVertexAttrib4sARBPROC,"glVertexAttrib4sARB");
453     SAFE_GET_PROC(qglVertexAttrib4fARB,glVertexAttrib4fARBPROC,"glVertexAttrib4fARB");
454     SAFE_GET_PROC(qglVertexAttrib4dARB,glVertexAttrib4dARBPROC,"glVertexAttrib4dARB");
455     SAFE_GET_PROC(qglVertexAttrib4NubARB,glVertexAttrib4NubARBPROC,"glVertexAttrib4NubARB");
456     SAFE_GET_PROC(qglVertexAttrib1svARB,glVertexAttrib1svARBPROC,"glVertexAttrib1svARB");
457     SAFE_GET_PROC(qglVertexAttrib1fvARB,glVertexAttrib1fvARBPROC,"glVertexAttrib1fvARB");
458     SAFE_GET_PROC(qglVertexAttrib1dvARB,glVertexAttrib1dvARBPROC,"glVertexAttrib1dvARB");
459     SAFE_GET_PROC(qglVertexAttrib2svARB,glVertexAttrib2svARBPROC,"glVertexAttrib2svARB");
460     SAFE_GET_PROC(qglVertexAttrib2fvARB,glVertexAttrib2fvARBPROC,"glVertexAttrib2fvARB");
461     SAFE_GET_PROC(qglVertexAttrib2dvARB,glVertexAttrib2dvARBPROC,"glVertexAttrib2dvARB");
462     SAFE_GET_PROC(qglVertexAttrib3svARB,glVertexAttrib3svARBPROC,"glVertexAttrib3svARB");
463     SAFE_GET_PROC(qglVertexAttrib3fvARB,glVertexAttrib3fvARBPROC,"glVertexAttrib3fvARB");
464     SAFE_GET_PROC(qglVertexAttrib3dvARB,glVertexAttrib3dvARBPROC,"glVertexAttrib3dvARB");
465     SAFE_GET_PROC(qglVertexAttrib4bvARB,glVertexAttrib4bvARBPROC,"glVertexAttrib4bvARB");
466     SAFE_GET_PROC(qglVertexAttrib4svARB,glVertexAttrib4svARBPROC,"glVertexAttrib4svARB");
467     SAFE_GET_PROC(qglVertexAttrib4ivARB,glVertexAttrib4ivARBPROC,"glVertexAttrib4ivARB");
468     SAFE_GET_PROC(qglVertexAttrib4ubvARB,glVertexAttrib4ubvARBPROC,"glVertexAttrib4ubvARB");
469     SAFE_GET_PROC(qglVertexAttrib4usvARB,glVertexAttrib4usvARBPROC,"glVertexAttrib4usvARB");
470     SAFE_GET_PROC(qglVertexAttrib4uivARB,glVertexAttrib4uivARBPROC,"glVertexAttrib4uivARB");
471     SAFE_GET_PROC(qglVertexAttrib4fvARB,glVertexAttrib4fvARBPROC,"glVertexAttrib4fvARB");
472     SAFE_GET_PROC(qglVertexAttrib4dvARB,glVertexAttrib4dvARBPROC,"glVertexAttrib4dvARB");
473     SAFE_GET_PROC(qglVertexAttrib4NbvARB,glVertexAttrib4NbvARBPROC,"glVertexAttrib4NbvARB");
474     SAFE_GET_PROC(qglVertexAttrib4NsvARB,glVertexAttrib4NsvARBPROC,"glVertexAttrib4NsvARB");
475     SAFE_GET_PROC(qglVertexAttrib4NivARB,glVertexAttrib4NivARBPROC,"glVertexAttrib4NivARB");
476     SAFE_GET_PROC(qglVertexAttrib4NubvARB,glVertexAttrib4NubvARBPROC,"glVertexAttrib4NubvARB");
477     SAFE_GET_PROC(qglVertexAttrib4NusvARB,glVertexAttrib4NusvARBPROC,"glVertexAttrib4NusvARB");
478     SAFE_GET_PROC(qglVertexAttrib4NuivARB,glVertexAttrib4NuivARBPROC,"glVertexAttrib4NuivARB");
479     SAFE_GET_PROC(qglVertexAttribPointerARB,glVertexAttribPointerARBPROC,"glVertexAttribPointerARB");
480     SAFE_GET_PROC(qglEnableVertexAttribArrayARB,glEnableVertexAttribArrayARBPROC,"glEnableVertexAttribArrayARB");
481     SAFE_GET_PROC(qglDisableVertexAttribArrayARB,glDisableVertexAttribArrayARBPROC,"glDisableVertexAttribArrayARB");
482     SAFE_GET_PROC(qglProgramStringARB,glProgramStringARBPROC,"glProgramStringARB");
483     SAFE_GET_PROC(qglBindProgramARB,glBindProgramARBPROC,"glBindProgramARB");
484     SAFE_GET_PROC(qglDeleteProgramsARB,glDeleteProgramsARBPROC,"glDeleteProgramsARB");
485     SAFE_GET_PROC(qglGenProgramsARB,glGenProgramsARBPROC,"glGenProgramsARB");
486     SAFE_GET_PROC(qglProgramEnvParameter4dARB,glProgramEnvParameter4dARBPROC,"glProgramEnvParameter4dARB");
487     SAFE_GET_PROC(qglProgramEnvParameter4dvARB,glProgramEnvParameter4dvARBPROC,"glProgramEnvParameter4dvARB");
488     SAFE_GET_PROC(qglProgramEnvParameter4fARB,glProgramEnvParameter4fARBPROC,"glProgramEnvParameter4fARB");
489     SAFE_GET_PROC(qglProgramEnvParameter4fvARB,glProgramEnvParameter4fvARBPROC,"glProgramEnvParameter4fvARB");
490     SAFE_GET_PROC(qglProgramLocalParameter4dARB,glProgramLocalParameter4dARBPROC,"glProgramLocalParameter4dARB");
491     SAFE_GET_PROC(qglProgramLocalParameter4dvARB,glProgramLocalParameter4dvARBPROC,"glProgramLocalParameter4dvARB");
492     SAFE_GET_PROC(qglProgramLocalParameter4fARB,glProgramLocalParameter4fARBPROC,"glProgramLocalParameter4fARB");
493     SAFE_GET_PROC(qglProgramLocalParameter4fvARB,glProgramLocalParameter4fvARBPROC,"glProgramLocalParameter4fvARB");
494     SAFE_GET_PROC(qglGetProgramEnvParameterdvARB,glGetProgramEnvParameterdvARBPROC,"glGetProgramEnvParameterdvARB");
495     SAFE_GET_PROC(qglGetProgramEnvParameterfvARB,glGetProgramEnvParameterfvARBPROC,"glGetProgramEnvParameterfvARB");
496     SAFE_GET_PROC(qglGetProgramLocalParameterdvARB,glGetProgramLocalParameterdvARBPROC,"glGetProgramLocalParameterdvARB");
497     SAFE_GET_PROC(qglGetProgramLocalParameterfvARB,glGetProgramLocalParameterfvARBPROC,"glGetProgramLocalParameterfvARB");
498     SAFE_GET_PROC(qglGetProgramivARB,glGetProgramivARBPROC,"glGetProgramivARB");
499     SAFE_GET_PROC(qglGetProgramStringARB,glGetProgramStringARBPROC,"glGetProgramStringARB");
500     SAFE_GET_PROC(qglGetVertexAttribdvARB,glGetVertexAttribdvARBPROC,"glGetVertexAttribdvARB");
501     SAFE_GET_PROC(qglGetVertexAttribfvARB,glGetVertexAttribfvARBPROC,"glGetVertexAttribfvARB");
502     SAFE_GET_PROC(qglGetVertexAttribivARB,glGetVertexAttribivARBPROC,"glGetVertexAttribivARB");
503     SAFE_GET_PROC(qglGetVertexAttribPointervARB,glGetVertexAttribPointervARBPROC,"glGetVertexAttribPointervARB");
504     SAFE_GET_PROC(qglIsProgramARB,glIsProgramARBPROC,"glIsProgramARB");
505 
506     SAFE_GET_PROC( qglPNTrianglesiATI, PFNGLPNTRIANGLESIATIPROC, "glPNTrianglesiATI");
507     SAFE_GET_PROC( qglPNTrianglesfATI, PFNGLPNTRIANGLESFATIPROC, "glPNTrianglesfATI");
508 #endif /* !__APPLE__ && !MACOSX */
509 
510     glEnable(GL_VERTEX_PROGRAM_ARB);
511     checkerror();
512 
513     qglGenProgramsARB(2, &vertex_programs[0]);
514     checkerror();
515     qglBindProgramARB(GL_VERTEX_PROGRAM_ARB, vertex_programs[0]);
516     checkerror();
517     qglProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
518 		        sizeof(vertexprogram)-1, vertexprogram);
519     checkerror();
520 
521     qglBindProgramARB(GL_VERTEX_PROGRAM_ARB, vertex_programs[1]);
522     checkerror();
523     qglProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
524 		        sizeof(vertexprogram2)-1, vertexprogram2);
525     checkerror();
526 
527     glDisable(GL_VERTEX_PROGRAM_ARB);
528     checkerror();
529 
530     glEnable(GL_FRAGMENT_PROGRAM_ARB);
531     checkerror();
532 
533     qglGenProgramsARB(2, &fragment_programs[0]);
534     checkerror();
535     qglBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, fragment_programs[0]);
536     checkerror();
537     qglProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
538 		                sizeof(fragmentprogram)-1, fragmentprogram);
539     checkerror();
540 
541     qglBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, fragment_programs[1]);
542     checkerror();
543     qglProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
544 		                sizeof(fragmentprogram2)-1, fragmentprogram2);
545     checkerror();
546 
547     glDisable(GL_FRAGMENT_PROGRAM_ARB);
548     checkerror();
549 }
550 
GL_DisableDiffuseShaderARB()551 void GL_DisableDiffuseShaderARB()
552 {
553     //tex 0 = normal map
554     //tex 1 = normalization cube map (tangent space light vector)
555     //tex 2 = normalization cube map (tangent space half vector)
556     //tex 3 = color map
557     //tex 4 = (attenuation or light filter, depends on light settings)
558 
559     glDisable(GL_FRAGMENT_PROGRAM_ARB);
560     glDisable(GL_VERTEX_PROGRAM_ARB);
561 
562     GL_SelectTexture(GL_TEXTURE1_ARB);
563     glDisable(GL_TEXTURE_2D);
564 
565     GL_SelectTexture(GL_TEXTURE2_ARB);
566     glDisable(GL_TEXTURE_3D);
567     glPopMatrix();
568 
569     if (currentshadowlight->filtercube)
570     {
571 	GL_SelectTexture(GL_TEXTURE3_ARB);
572 	glDisable(GL_TEXTURE_CUBE_MAP_ARB);
573 	glPopMatrix();
574     }
575     glMatrixMode(GL_MODELVIEW);
576 
577     GL_SelectTexture(GL_TEXTURE0_ARB);
578 }
579 
GL_EnableDiffuseSpecularShaderARB(qboolean world,vec3_t lightOrig)580 void GL_EnableDiffuseSpecularShaderARB(qboolean world, vec3_t lightOrig)
581 {
582     float invrad = 1/currentshadowlight->radius;
583 
584     //tex 0 = normal map
585     //tex 1 = normalization cube map (tangent space light vector)
586     //tex 2 = normalization cube map (tangent space half vector)
587     //tex 3 = color map
588     //tex 4 = (attenuation or light filter, depends on light settings but the actual
589     //  register combiner setup does not change only the bound texture)
590 
591     GL_SelectTexture(GL_TEXTURE1_ARB);
592     glEnable(GL_TEXTURE_2D);
593 
594     GL_SelectTexture(GL_TEXTURE2_ARB);
595     glMatrixMode(GL_TEXTURE);
596     glPushMatrix();
597     glLoadIdentity();
598 
599     glEnable(GL_TEXTURE_3D);
600     glBindTexture(GL_TEXTURE_3D, atten3d_texture_object);
601 
602     glTranslatef(0.5,0.5,0.5);
603     glScalef(0.5,0.5,0.5);
604     glScalef(invrad, invrad, invrad);
605     glTranslatef(-lightOrig[0], -lightOrig[1], -lightOrig[2]);
606 
607     glGetError();
608     glEnable(GL_VERTEX_PROGRAM_ARB);
609     checkerror();
610     glEnable(GL_FRAGMENT_PROGRAM_ARB);
611     checkerror();
612 
613     if (currentshadowlight->filtercube)
614     {
615 	GL_SelectTexture(GL_TEXTURE3_ARB);
616 	glMatrixMode(GL_TEXTURE);
617 	glPushMatrix();
618 	glLoadIdentity();
619 
620         glEnable(GL_TEXTURE_CUBE_MAP_ARB);
621         glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, currentshadowlight->filtercube);
622         GL_SetupCubeMapMatrix(world);
623 
624 	qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, vertex_programs[1] );
625 	checkerror();
626 	qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, fragment_programs[1] );
627 	checkerror();
628     }
629     else
630     {
631 	qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, vertex_programs[0] );
632 	checkerror();
633 	qglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, fragment_programs[0] );
634 	checkerror();
635     }
636 
637     GL_SelectTexture(GL_TEXTURE0_ARB);
638 }
639 
R_DrawWorldARBDiffuseSpecular(lightcmd_t * lightCmds)640 void R_DrawWorldARBDiffuseSpecular(lightcmd_t *lightCmds)
641 {
642     int command, num, i;
643     int lightPos = 0;
644     vec3_t lightOr;
645     msurface_t *surf;
646     float               *v;
647     float* lightP;
648     vec3_t lightDir;
649     vec3_t tsH,H;
650 
651     texture_t   *t;//XYZ
652 
653     //support flickering lights
654     VectorCopy(currentshadowlight->origin,lightOr);
655 
656     while (1)
657     {
658         command = lightCmds[lightPos++].asInt;
659         if (command == 0) break; //end of list
660 
661         surf = lightCmds[lightPos++].asVoid;
662 
663         if (surf->visframe != r_framecount) {
664             lightPos+=(4+surf->polys->numverts*(2+3));
665             continue;
666         }
667 
668         num = surf->polys->numverts;
669         lightPos+=4;//skip color
670 
671         //XYZ
672         t = R_TextureAnimation (surf->texinfo->texture);
673 
674         GL_SelectTexture(GL_TEXTURE0_ARB);
675         GL_Bind(t->gl_texturenum+1);
676         GL_SelectTexture(GL_TEXTURE1_ARB);
677         GL_Bind(t->gl_texturenum);
678 
679         glBegin(command);
680         //v = surf->polys->verts[0];
681         v = (float *)(&globalVertexTable[surf->polys->firstvertex]);
682         for (i=0; i<num; i++, v+= VERTEXSIZE)
683         {
684             //skip attent texture coord.
685             lightPos += 2;
686 
687             lightP = &lightCmds[lightPos].asFloat;
688             lightPos += 3;
689 
690             VectorCopy(lightP, lightDir);
691             VectorNormalize(lightDir);
692 
693             //calculate local H vector and put it into tangent space
694 
695             //r_origin = camera position
696             VectorSubtract(r_refdef.vieworg,v,H);
697             VectorNormalize(H);
698 
699             //put H in tangent space first since lightDir (precalc) is already in tang space
700             if (surf->flags & SURF_PLANEBACK)
701             {
702                 tsH[2] = -DotProduct(H,surf->plane->normal);
703             }
704             else
705             {
706                 tsH[2] = DotProduct(H,surf->plane->normal);
707             }
708 
709             tsH[1] = -DotProduct(H,surf->texinfo->vecs[1]);
710             tsH[0] = DotProduct(H,surf->texinfo->vecs[0]);
711 
712             VectorAdd(lightDir,tsH,tsH);
713 
714             // diffuse
715             qglMultiTexCoord2fARB(GL_TEXTURE0_ARB, v[3], v[4]);
716 
717             qglMultiTexCoord3fvARB(GL_TEXTURE1_ARB, lightP);
718 
719             // half vector for specular
720             qglMultiTexCoord3fvARB(GL_TEXTURE2_ARB,&tsH[0]);
721 
722             glVertex3fv(&v[0]);
723         }
724         glEnd();
725     }
726 
727     GL_SelectTexture(GL_TEXTURE0_ARB);
728 }
729 
730 
731 
R_DrawBrushARBDiffuseSpecular(entity_t * e)732 void R_DrawBrushARBDiffuseSpecular(entity_t *e)
733 {
734     model_t     *model = e->model;
735     msurface_t *surf;
736     glpoly_t    *poly;
737     int         i, j, count;
738     brushlightinstant_t *ins = e->brushlightinstant;
739     float       *v;
740     texture_t   *t;//XYZ
741 
742     count = 0;
743 
744     surf = &model->surfaces[model->firstmodelsurface];
745     for (i=0; i<model->nummodelsurfaces; i++, surf++)
746     {
747         if (!ins->polygonVis[i]) continue;
748 
749         poly = surf->polys;
750 
751         //XYZ
752         t = R_TextureAnimation (surf->texinfo->texture);
753 
754         GL_SelectTexture(GL_TEXTURE0_ARB);
755         GL_Bind(t->gl_texturenum+1);
756         GL_SelectTexture(GL_TEXTURE1_ARB);
757         GL_Bind(t->gl_texturenum);
758 
759         glBegin(GL_TRIANGLE_FAN);
760         //v = poly->verts[0];
761         v = (float *)(&globalVertexTable[poly->firstvertex]);
762         for (j=0 ; j<poly->numverts ; j++, v+= VERTEXSIZE)
763         {
764             qglMultiTexCoord2fARB(GL_TEXTURE0_ARB, v[3], v[4]);
765             qglMultiTexCoord3fvARB(GL_TEXTURE1_ARB,&ins->tslights[count+j][0]);
766             qglMultiTexCoord3fvARB(GL_TEXTURE2_ARB,&ins->tshalfangles[count+j][0]);
767             glVertex3fv(v);
768         }
769         glEnd();
770         count+=surf->numedges;
771     }
772 }
773 
774 
R_DrawAliasFrameARBDiffuseSpecular(aliashdr_t * paliashdr,aliasframeinstant_t * instant)775 void R_DrawAliasFrameARBDiffuseSpecular (aliashdr_t *paliashdr, aliasframeinstant_t *instant)
776 {
777 
778     mtriangle_t *tris;
779     fstvert_t   *texcoords;
780     int anim;
781     int                 *indecies;
782     aliaslightinstant_t *linstant = instant->lightinstant;
783 
784     tris = (mtriangle_t *)((byte *)paliashdr + paliashdr->triangles);
785     texcoords = (fstvert_t *)((byte *)paliashdr + paliashdr->texcoords);
786 
787     //bind normal map
788     anim = (int)(cl.time*10) & 3;
789 
790     GL_SelectTexture(GL_TEXTURE0_ARB);
791     GL_Bind(paliashdr->gl_texturenum[currententity->skinnum][anim]+1);
792     GL_SelectTexture(GL_TEXTURE1_ARB);
793     GL_Bind(paliashdr->gl_texturenum[currententity->skinnum][anim]);
794 
795     indecies = (int *)((byte *)paliashdr + paliashdr->indecies);
796 
797     glVertexPointer(3, GL_FLOAT, 0, instant->vertices);
798     glEnableClientState(GL_VERTEX_ARRAY);
799     glNormalPointer(GL_FLOAT, 0, instant->normals);
800     glEnableClientState(GL_NORMAL_ARRAY);
801 
802     qglClientActiveTextureARB(GL_TEXTURE0_ARB);
803     glTexCoordPointer(2, GL_FLOAT, 0, texcoords);
804     glEnableClientState(GL_TEXTURE_COORD_ARRAY);
805 
806     qglClientActiveTextureARB(GL_TEXTURE1_ARB);
807     glTexCoordPointer(3, GL_FLOAT, 0, linstant->tslights);
808     glEnableClientState(GL_TEXTURE_COORD_ARRAY);
809 
810     qglClientActiveTextureARB(GL_TEXTURE2_ARB);
811     glTexCoordPointer(3, GL_FLOAT, 0, linstant->tshalfangles);
812     glEnableClientState(GL_TEXTURE_COORD_ARRAY);
813 
814 
815     //glDrawElements(GL_TRIANGLES,paliashdr->numtris*3,GL_UNSIGNED_INT,indecies);
816     glDrawElements(GL_TRIANGLES,linstant->numtris*3,GL_UNSIGNED_INT,&linstant->indecies[0]);
817 
818     glDisableClientState(GL_VERTEX_ARRAY);
819     glDisableClientState(GL_NORMAL_ARRAY);
820     glDisableClientState(GL_TEXTURE_COORD_ARRAY);
821     qglClientActiveTextureARB(GL_TEXTURE0_ARB);
822     GL_SelectTexture(GL_TEXTURE0_ARB);
823     glDisableClientState(GL_TEXTURE_COORD_ARRAY);
824 }
825 
R_DrawWorldBumpedARB()826 void R_DrawWorldBumpedARB()
827 {
828     if (!currentshadowlight->visible)
829         return;
830 
831     glDepthMask (0);
832     glShadeModel (GL_SMOOTH);
833 
834     GL_AddColor();
835     glColor3fv(&currentshadowlight->color[0]);
836 
837     GL_EnableDiffuseSpecularShaderARB(true,currentshadowlight->origin);
838     R_DrawWorldARBDiffuseSpecular(currentshadowlight->lightCmds);
839     GL_DisableDiffuseShaderARB();
840 
841     glColor3f (1,1,1);
842     glDisable (GL_BLEND);
843     glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
844     glDepthMask (1);
845 }
846 
R_DrawBrushBumpedARB(entity_t * e)847 void R_DrawBrushBumpedARB(entity_t *e)
848 {
849     GL_AddColor();
850     glColor3fv(&currentshadowlight->color[0]);
851 
852     GL_EnableDiffuseSpecularShaderARB(false,((brushlightinstant_t *)e->brushlightinstant)->lightpos);
853     R_DrawBrushARBDiffuseSpecular(e);
854     GL_DisableDiffuseShaderARB();
855 }
856 
R_DrawAliasBumpedARB(aliashdr_t * paliashdr,aliasframeinstant_t * instant)857 void R_DrawAliasBumpedARB(aliashdr_t *paliashdr, aliasframeinstant_t *instant)
858 {
859     if ( gl_truform.value )
860     {
861         glEnable(GL_PN_TRIANGLES_ATI);
862 	qglPNTrianglesiATI(GL_PN_TRIANGLES_POINT_MODE_ATI, GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI);
863 	qglPNTrianglesiATI(GL_PN_TRIANGLES_NORMAL_MODE_ATI, GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI);
864 	qglPNTrianglesiATI(GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI, gl_truform_tesselation.value);
865     }
866 
867     GL_AddColor();
868     glColor3fv(&currentshadowlight->color[0]);
869 
870     GL_EnableDiffuseSpecularShaderARB(false,instant->lightinstant->lightpos);
871     R_DrawAliasFrameARBDiffuseSpecular(paliashdr,instant);
872     GL_DisableDiffuseShaderARB();
873 
874     if ( gl_truform.value )
875     {
876         glDisable(GL_PN_TRIANGLES_ATI);
877     }
878 }
879