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