-
Notifications
You must be signed in to change notification settings - Fork 44
/
Copy pathr_qshader.h
274 lines (243 loc) · 6.11 KB
/
r_qshader.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
#ifndef QSHADER_H
#define QSHADER_H
#include "qtypes.h"
// various flags from shaders, used for special effects not otherwise classified
// TODO: support these features more directly
#define Q3TEXTUREFLAG_TWOSIDED 1
#define Q3TEXTUREFLAG_NOPICMIP 16
#define Q3TEXTUREFLAG_POLYGONOFFSET 32
#define Q3TEXTUREFLAG_REFRACTION 256
#define Q3TEXTUREFLAG_REFLECTION 512
#define Q3TEXTUREFLAG_WATERSHADER 1024
#define Q3TEXTUREFLAG_CAMERA 2048
#define Q3TEXTUREFLAG_TRANSPARENTSORT 4096
#define Q3PATHLENGTH 64
#define TEXTURE_MAXFRAMES 64
#define Q3WAVEPARMS 4
#define Q3DEFORM_MAXPARMS 3
#define Q3SHADER_MAXLAYERS 8
#define Q3RGBGEN_MAXPARMS 3
#define Q3ALPHAGEN_MAXPARMS 1
#define Q3TCGEN_MAXPARMS 6
#define Q3TCMOD_MAXPARMS 6
#define Q3MAXTCMODS 8
#define Q3MAXDEFORMS 4
typedef enum q3wavefunc_e
{
Q3WAVEFUNC_NONE,
Q3WAVEFUNC_INVERSESAWTOOTH,
Q3WAVEFUNC_NOISE,
Q3WAVEFUNC_SAWTOOTH,
Q3WAVEFUNC_SIN,
Q3WAVEFUNC_SQUARE,
Q3WAVEFUNC_TRIANGLE,
Q3WAVEFUNC_COUNT
}
q3wavefunc_e;
typedef int q3wavefunc_t;
#define Q3WAVEFUNC_USER_COUNT 4
#define Q3WAVEFUNC_USER_SHIFT 8 // use 8 bits for wave func type
typedef enum q3deform_e
{
Q3DEFORM_NONE,
Q3DEFORM_PROJECTIONSHADOW,
Q3DEFORM_AUTOSPRITE,
Q3DEFORM_AUTOSPRITE2,
Q3DEFORM_TEXT0,
Q3DEFORM_TEXT1,
Q3DEFORM_TEXT2,
Q3DEFORM_TEXT3,
Q3DEFORM_TEXT4,
Q3DEFORM_TEXT5,
Q3DEFORM_TEXT6,
Q3DEFORM_TEXT7,
Q3DEFORM_BULGE,
Q3DEFORM_WAVE,
Q3DEFORM_NORMAL,
Q3DEFORM_MOVE,
Q3DEFORM_COUNT
}
q3deform_t;
typedef enum q3rgbgen_e
{
Q3RGBGEN_IDENTITY,
Q3RGBGEN_CONST,
Q3RGBGEN_ENTITY,
Q3RGBGEN_EXACTVERTEX,
Q3RGBGEN_IDENTITYLIGHTING,
Q3RGBGEN_LIGHTINGDIFFUSE,
Q3RGBGEN_ONEMINUSENTITY,
Q3RGBGEN_ONEMINUSVERTEX,
Q3RGBGEN_VERTEX,
Q3RGBGEN_WAVE,
Q3RGBGEN_COUNT
}
q3rgbgen_t;
typedef enum q3alphagen_e
{
Q3ALPHAGEN_IDENTITY,
Q3ALPHAGEN_CONST,
Q3ALPHAGEN_ENTITY,
Q3ALPHAGEN_LIGHTINGSPECULAR,
Q3ALPHAGEN_ONEMINUSENTITY,
Q3ALPHAGEN_ONEMINUSVERTEX,
Q3ALPHAGEN_PORTAL,
Q3ALPHAGEN_VERTEX,
Q3ALPHAGEN_WAVE,
Q3ALPHAGEN_COUNT
}
q3alphagen_t;
typedef enum q3tcgen_e
{
Q3TCGEN_NONE,
Q3TCGEN_TEXTURE, // very common
Q3TCGEN_ENVIRONMENT, // common
Q3TCGEN_LIGHTMAP,
Q3TCGEN_VECTOR,
Q3TCGEN_COUNT
}
q3tcgen_t;
typedef enum q3tcmod_e
{
Q3TCMOD_NONE,
Q3TCMOD_ENTITYTRANSLATE,
Q3TCMOD_ROTATE,
Q3TCMOD_SCALE,
Q3TCMOD_SCROLL,
Q3TCMOD_STRETCH,
Q3TCMOD_TRANSFORM,
Q3TCMOD_TURBULENT,
Q3TCMOD_PAGE,
Q3TCMOD_COUNT
}
q3tcmod_t;
typedef struct q3shaderinfo_layer_rgbgen_s
{
q3rgbgen_t rgbgen;
float parms[Q3RGBGEN_MAXPARMS];
q3wavefunc_t wavefunc;
float waveparms[Q3WAVEPARMS];
}
q3shaderinfo_layer_rgbgen_t;
typedef struct q3shaderinfo_layer_alphagen_s
{
q3alphagen_t alphagen;
float parms[Q3ALPHAGEN_MAXPARMS];
q3wavefunc_t wavefunc;
float waveparms[Q3WAVEPARMS];
}
q3shaderinfo_layer_alphagen_t;
typedef struct q3shaderinfo_layer_tcgen_s
{
q3tcgen_t tcgen;
float parms[Q3TCGEN_MAXPARMS];
}
q3shaderinfo_layer_tcgen_t;
typedef struct q3shaderinfo_layer_tcmod_s
{
q3tcmod_t tcmod;
float parms[Q3TCMOD_MAXPARMS];
q3wavefunc_t wavefunc;
float waveparms[Q3WAVEPARMS];
}
q3shaderinfo_layer_tcmod_t;
typedef struct q3shaderinfo_layer_s
{
int alphatest;
int clampmap;
float framerate;
int numframes;
int dptexflags;
char** texturename;
int blendfunc[2];
q3shaderinfo_layer_rgbgen_t rgbgen;
q3shaderinfo_layer_alphagen_t alphagen;
q3shaderinfo_layer_tcgen_t tcgen;
q3shaderinfo_layer_tcmod_t tcmods[Q3MAXTCMODS];
}
q3shaderinfo_layer_t;
typedef struct q3shaderinfo_deform_s
{
q3deform_t deform;
float parms[Q3DEFORM_MAXPARMS];
q3wavefunc_t wavefunc;
float waveparms[Q3WAVEPARMS];
}
q3shaderinfo_deform_t;
typedef enum dpoffsetmapping_technique_s
{
OFFSETMAPPING_OFF, // none
OFFSETMAPPING_DEFAULT, // cvar-set
OFFSETMAPPING_LINEAR, // linear
OFFSETMAPPING_RELIEF // relief
}dpoffsetmapping_technique_t;
typedef enum dptransparentsort_category_e
{
TRANSPARENTSORT_SKY,
TRANSPARENTSORT_DISTANCE,
TRANSPARENTSORT_HUD,
}dptransparentsortcategory_t;
typedef struct shader_s
{
char name[Q3PATHLENGTH];
#define Q3SHADERINFO_COMPARE_START surfaceparms
int surfaceparms;
int surfaceflags;
int textureflags;
int numlayers;
qbool lighting;
qbool vertexalpha;
qbool textureblendalpha;
q3shaderinfo_layer_t layers[Q3SHADER_MAXLAYERS];
char skyboxname[Q3PATHLENGTH];
q3shaderinfo_deform_t deforms[Q3MAXDEFORMS];
// dp-specific additions:
// shadow control
qbool dpnortlight;
qbool dpshadow;
qbool dpnoshadow;
// add collisions to all triangles of the surface
qbool dpmeshcollisions;
// kill shader based on cvar checks
qbool dpshaderkill;
// fake reflection
char dpreflectcube[Q3PATHLENGTH];
// reflection
float reflectmin; // when refraction is used, minimum amount of reflection (when looking straight down)
float reflectmax; // when refraction is used, maximum amount of reflection (when looking parallel to water)
float refractfactor; // amount of refraction distort (1.0 = like the cvar specifies)
vec4_t refractcolor4f; // color tint of refraction (including alpha factor)
float reflectfactor; // amount of reflection distort (1.0 = like the cvar specifies)
vec4_t reflectcolor4f; // color tint of reflection (including alpha factor)
float r_water_wateralpha; // additional wateralpha to apply when r_water is active
float r_water_waterscroll[2]; // water normalmapscrollblend - scale and speed
// offsetmapping
dpoffsetmapping_technique_t offsetmapping;
float offsetscale;
float offsetbias; // 0 is normal, 1 leads to alpha 0 being neutral and alpha 1 pushing "out"
// polygonoffset (only used if Q3TEXTUREFLAG_POLYGONOFFSET)
float biaspolygonoffset, biaspolygonfactor;
// transparent sort category
dptransparentsortcategory_t transparentsort;
// gloss
float specularscalemod;
float specularpowermod;
// rtlighting ambient addition
float rtlightambient;
#define Q3SHADERINFO_COMPARE_END rtlightambient
}
shader_t;
typedef struct texture_shaderpass_s
{
qbool alphatest; // FIXME: handle alphafunc properly
float framerate;
int numframes;
struct skinframe_s *skinframes[TEXTURE_MAXFRAMES];
int blendfunc[2];
q3shaderinfo_layer_rgbgen_t rgbgen;
q3shaderinfo_layer_alphagen_t alphagen;
q3shaderinfo_layer_tcgen_t tcgen;
q3shaderinfo_layer_tcmod_t tcmods[Q3MAXTCMODS];
}
texture_shaderpass_t;
#endif