]> de.git.xonotic.org Git - xonotic/darkplaces.git/blob - dpsoftrast.h
move double break in pseudoalpha case to the right case...
[xonotic/darkplaces.git] / dpsoftrast.h
1
2 #ifndef DPSOFTRAST_H
3 #define DPSOFTRAST_H
4
5 #include <stdlib.h>
6
7 #define DPSOFTRAST_MAXMIPMAPS 16
8 #define DPSOFTRAST_TEXTURE_MAXSIZE (1<<(DPSOFTRAST_MAXMIPMAPS - 1))
9 #define DPSOFTRAST_MAXTEXTUREUNITS 32
10 #define DPSOFTRAST_MAXTEXCOORDARRAYS 8
11
12 // type of pixels in texture (some of these are converted to BGRA8 on update)
13 #define DPSOFTRAST_TEXTURE_FORMAT_BGRA8 0
14 #define DPSOFTRAST_TEXTURE_FORMAT_DEPTH 1
15 #define DPSOFTRAST_TEXTURE_FORMAT_RGBA8 2
16 #define DPSOFTRAST_TEXTURE_FORMAT_ALPHA8 3
17 #define DPSOFTRAST_TEXTURE_FORMAT_COMPAREMASK 3
18
19 // modifier flags for texture (can not be changed after creation)
20 #define DPSOFTRAST_TEXTURE_FLAG_MIPMAP 4
21 #define DPSOFTRAST_TEXTURE_FLAG_CUBEMAP 8
22 #define DPSOFTRAST_TEXTURE_FLAG_USEALPHA 16
23 #define DPSOFTRAST_TEXTURE_FLAG_CLAMPTOEDGE 32
24
25 typedef enum DPSOFTRAST_TEXTURE_FILTER_e
26 {
27         DPSOFTRAST_TEXTURE_FILTER_NEAREST = 0,
28         DPSOFTRAST_TEXTURE_FILTER_LINEAR = 1,
29         DPSOFTRAST_TEXTURE_FILTER_NEAREST_MIPMAP_TRIANGLE = 2,
30         DPSOFTRAST_TEXTURE_FILTER_LINEAR_MIPMAP_TRIANGLE = 3,
31 }
32 DPSOFTRAST_TEXTURE_FILTER;
33
34 void DPSOFTRAST_Init(int width, int height, unsigned int *colorpixels, unsigned int *depthpixels);
35 void DPSOFTRAST_Shutdown(void);
36
37 int DPSOFTRAST_Texture_New(int flags, int width, int height, int depth);
38 void DPSOFTRAST_Texture_Free(int index);
39 void DPSOFTRAST_Texture_UpdatePartial(int index, int mip, const unsigned char *pixels, int blockx, int blocky, int blockwidth, int blockheight);
40 void DPSOFTRAST_Texture_UpdateFull(int index, const unsigned char *pixels);
41 int DPSOFTRAST_Texture_GetWidth(int index, int mip);
42 int DPSOFTRAST_Texture_GetHeight(int index, int mip);
43 int DPSOFTRAST_Texture_GetDepth(int index, int mip);
44 unsigned char *DPSOFTRAST_Texture_GetPixelPointer(int index, int mip);
45 void DPSOFTRAST_Texture_Filter(int index, DPSOFTRAST_TEXTURE_FILTER filter);
46
47 void DPSOFTRAST_SetRenderTargets(int width, int height, unsigned int *depthpixels, unsigned int *colorpixels0, unsigned int *colorpixels1, unsigned int *colorpixels2, unsigned int *colorpixels3);
48 void DPSOFTRAST_Viewport(int x, int y, int width, int height);
49 void DPSOFTRAST_ClearColor(float r, float g, float b, float a);
50 void DPSOFTRAST_ClearDepth(float d);
51 void DPSOFTRAST_ColorMask(int r, int g, int b, int a);
52 void DPSOFTRAST_DepthTest(int enable);
53 void DPSOFTRAST_ScissorTest(int enable);
54 void DPSOFTRAST_Scissor(float x, float y, float width, float height);
55
56 void DPSOFTRAST_BlendFunc(int smodulate, int dmodulate);
57 void DPSOFTRAST_BlendSubtract(int enable);
58 void DPSOFTRAST_DepthMask(int enable);
59 void DPSOFTRAST_DepthFunc(int comparemode);
60 void DPSOFTRAST_DepthRange(float range0, float range1);
61 void DPSOFTRAST_PolygonOffset(float alongnormal, float intoview);
62 void DPSOFTRAST_CullFace(int mode);
63 void DPSOFTRAST_AlphaTest(float enable);
64 void DPSOFTRAST_AlphaFunc(int alphafunc, float alphavalue);
65 void DPSOFTRAST_Color4f(float r, float g, float b, float a);
66 void DPSOFTRAST_GetPixelsBGRA(int blockx, int blocky, int blockwidth, int blockheight, unsigned char *outpixels);
67 void DPSOFTRAST_CopyRectangleToTexture(int index, int mip, int tx, int ty, int sx, int sy, int width, int height);
68 void DPSOFTRAST_SetTexture(int unitnum, int index);
69
70 void DPSOFTRAST_SetVertexPointer(const float *vertex3f, size_t stride);
71 void DPSOFTRAST_SetColorPointer(const float *color4f, size_t stride);
72 void DPSOFTRAST_SetColorPointer4ub(const unsigned char *color4ub, size_t stride);
73 void DPSOFTRAST_SetTexCoordPointer(int unitnum, int numcomponents, size_t stride, const float *texcoordf);
74
75 typedef enum gl20_texunit_e
76 {
77         // postprocess shaders, and generic shaders:
78         GL20TU_FIRST = 0,
79         GL20TU_SECOND = 1,
80         GL20TU_GAMMARAMPS = 2,
81         // standard material properties
82         GL20TU_NORMAL = 0,
83         GL20TU_COLOR = 1,
84         GL20TU_GLOSS = 2,
85         GL20TU_GLOW = 3,
86         // material properties for a second material
87         GL20TU_SECONDARY_NORMAL = 4,
88         GL20TU_SECONDARY_COLOR = 5,
89         GL20TU_SECONDARY_GLOSS = 6,
90         GL20TU_SECONDARY_GLOW = 7,
91         // material properties for a colormapped material
92         // conflicts with secondary material
93         GL20TU_PANTS = 4,
94         GL20TU_SHIRT = 7,
95         // fog fade in the distance
96         GL20TU_FOGMASK = 8,
97         // compiled ambient lightmap and deluxemap
98         GL20TU_LIGHTMAP = 9,
99         GL20TU_DELUXEMAP = 10,
100         // refraction, used by water shaders
101         GL20TU_REFRACTION = 3,
102         // reflection, used by water shaders, also with normal material rendering
103         // conflicts with secondary material
104         GL20TU_REFLECTION = 7,
105         // rtlight attenuation (distance fade) and cubemap filter (projection texturing)
106         // conflicts with lightmap/deluxemap
107         GL20TU_ATTENUATION = 9,
108         GL20TU_CUBE = 10,
109         GL20TU_SHADOWMAP2D = 15,
110         GL20TU_CUBEPROJECTION = 12,
111         // rtlight prepass data (screenspace depth and normalmap)
112         GL20TU_SCREENDEPTH = 13,
113         GL20TU_SCREENNORMALMAP = 14,
114         // lightmap prepass data (screenspace diffuse and specular from lights)
115         GL20TU_SCREENDIFFUSE = 11,
116         GL20TU_SCREENSPECULAR = 12,
117         // fake reflections
118         GL20TU_REFLECTMASK = 5,
119         GL20TU_REFLECTCUBE = 6,
120         GL20TU_FOGHEIGHTTEXTURE = 14
121 }
122 gl20_texunit;
123
124 // this enum selects which of the glslshadermodeinfo entries should be used
125 typedef enum shadermode_e
126 {
127         SHADERMODE_GENERIC, ///< (particles/HUD/etc) vertex color, optionally multiplied by one texture
128         SHADERMODE_POSTPROCESS, ///< postprocessing shader (r_glsl_postprocess)
129         SHADERMODE_DEPTH_OR_SHADOW, ///< (depthfirst/shadows) vertex shader only
130         SHADERMODE_FLATCOLOR, ///< (lightmap) modulate texture by uniform color (q1bsp, q3bsp)
131         SHADERMODE_VERTEXCOLOR, ///< (lightmap) modulate texture by vertex colors (q3bsp)
132         SHADERMODE_LIGHTMAP, ///< (lightmap) modulate texture by lightmap texture (q1bsp, q3bsp)
133         SHADERMODE_FAKELIGHT, ///< (fakelight) modulate texture by "fake" lighting (no lightmaps, no nothing)
134         SHADERMODE_LIGHTDIRECTIONMAP_MODELSPACE, ///< (lightmap) use directional pixel shading from texture containing modelspace light directions (q3bsp deluxemap)
135         SHADERMODE_LIGHTDIRECTIONMAP_TANGENTSPACE, ///< (lightmap) use directional pixel shading from texture containing tangentspace light directions (q1bsp deluxemap)
136         SHADERMODE_LIGHTDIRECTION, ///< (lightmap) use directional pixel shading from fixed light direction (q3bsp)
137         SHADERMODE_LIGHTSOURCE, ///< (lightsource) use directional pixel shading from light source (rtlight)
138         SHADERMODE_REFRACTION, ///< refract background (the material is rendered normally after this pass)
139         SHADERMODE_WATER, ///< refract background and reflection (the material is rendered normally after this pass)
140         SHADERMODE_SHOWDEPTH, ///< (debugging) renders depth as color
141         SHADERMODE_DEFERREDGEOMETRY, ///< (deferred) render material properties to screenspace geometry buffers
142         SHADERMODE_DEFERREDLIGHTSOURCE, ///< (deferred) use directional pixel shading from light source (rtlight) on screenspace geometry buffers
143         SHADERMODE_COUNT
144 }
145 shadermode_t;
146
147 typedef enum shaderpermutation_e
148 {
149         SHADERPERMUTATION_DIFFUSE = 1<<0, ///< (lightsource) whether to use directional shading
150         SHADERPERMUTATION_VERTEXTEXTUREBLEND = 1<<1, ///< indicates this is a two-layer material blend based on vertex alpha (q3bsp)
151         SHADERPERMUTATION_VIEWTINT = 1<<2, ///< view tint (postprocessing only), use vertex colors (generic only)
152         SHADERPERMUTATION_COLORMAPPING = 1<<3, ///< indicates this is a colormapped skin
153         SHADERPERMUTATION_SATURATION = 1<<4, ///< saturation (postprocessing only)
154         SHADERPERMUTATION_FOGINSIDE = 1<<5, ///< tint the color by fog color or black if using additive blend mode
155         SHADERPERMUTATION_FOGOUTSIDE = 1<<6, ///< tint the color by fog color or black if using additive blend mode
156         SHADERPERMUTATION_FOGHEIGHTTEXTURE = 1<<7, ///< fog color and density determined by texture mapped on vertical axis
157         SHADERPERMUTATION_GAMMARAMPS = 1<<8, ///< gamma (postprocessing only)
158         SHADERPERMUTATION_CUBEFILTER = 1<<9, ///< (lightsource) use cubemap light filter
159         SHADERPERMUTATION_GLOW = 1<<10, ///< (lightmap) blend in an additive glow texture
160         SHADERPERMUTATION_BLOOM = 1<<11, ///< bloom (postprocessing only)
161         SHADERPERMUTATION_SPECULAR = 1<<12, ///< (lightsource or deluxemapping) render specular effects
162         SHADERPERMUTATION_POSTPROCESSING = 1<<13, ///< user defined postprocessing (postprocessing only)
163         SHADERPERMUTATION_REFLECTION = 1<<14, ///< normalmap-perturbed reflection of the scene infront of the surface, preformed as an overlay on the surface
164         SHADERPERMUTATION_OFFSETMAPPING = 1<<15, ///< adjust texcoords to roughly simulate a displacement mapped surface
165         SHADERPERMUTATION_OFFSETMAPPING_RELIEFMAPPING = 1<<16, ///< adjust texcoords to accurately simulate a displacement mapped surface (requires OFFSETMAPPING to also be set!)
166         SHADERPERMUTATION_SHADOWMAP2D = 1<<17, ///< (lightsource) use shadowmap texture as light filter
167         SHADERPERMUTATION_SHADOWMAPPCF = 1<<18, ///< (lightsource) use percentage closer filtering on shadowmap test results
168         SHADERPERMUTATION_SHADOWMAPPCF2 = 1<<19, ///< (lightsource) use higher quality percentage closer filtering on shadowmap test results
169         SHADERPERMUTATION_SHADOWSAMPLER = 1<<20, ///< (lightsource) use hardware shadowmap test
170         SHADERPERMUTATION_SHADOWMAPVSDCT = 1<<21, ///< (lightsource) use virtual shadow depth cube texture for shadowmap indexing
171         SHADERPERMUTATION_SHADOWMAPORTHO = 1<<22, //< (lightsource) use orthographic shadowmap projection
172         SHADERPERMUTATION_DEFERREDLIGHTMAP = 1<<23, ///< (lightmap) read Texture_ScreenDiffuse/Specular textures and add them on top of lightmapping
173         SHADERPERMUTATION_ALPHAKILL = 1<<24, ///< (deferredgeometry) discard pixel if diffuse texture alpha below 0.5
174         SHADERPERMUTATION_REFLECTCUBE = 1<<25, ///< fake reflections using global cubemap (not HDRI light probe)
175         SHADERPERMUTATION_NORMALMAPSCROLLBLEND = 1<<26, // (water) counter-direction normalmaps scrolling
176         SHADERPERMUTATION_LIMIT = 1<<27, ///< size of permutations array
177         SHADERPERMUTATION_COUNT = 27 ///< size of shaderpermutationinfo array
178 }
179 shaderpermutation_t;
180
181 typedef enum DPSOFTRAST_UNIFORM_e
182 {
183         DPSOFTRAST_UNIFORM_Texture_First,
184         DPSOFTRAST_UNIFORM_Texture_Second,
185         DPSOFTRAST_UNIFORM_Texture_GammaRamps,
186         DPSOFTRAST_UNIFORM_Texture_Normal,
187         DPSOFTRAST_UNIFORM_Texture_Color,
188         DPSOFTRAST_UNIFORM_Texture_Gloss,
189         DPSOFTRAST_UNIFORM_Texture_Glow,
190         DPSOFTRAST_UNIFORM_Texture_SecondaryNormal,
191         DPSOFTRAST_UNIFORM_Texture_SecondaryColor,
192         DPSOFTRAST_UNIFORM_Texture_SecondaryGloss,
193         DPSOFTRAST_UNIFORM_Texture_SecondaryGlow,
194         DPSOFTRAST_UNIFORM_Texture_Pants,
195         DPSOFTRAST_UNIFORM_Texture_Shirt,
196         DPSOFTRAST_UNIFORM_Texture_FogHeightTexture,
197         DPSOFTRAST_UNIFORM_Texture_FogMask,
198         DPSOFTRAST_UNIFORM_Texture_Lightmap,
199         DPSOFTRAST_UNIFORM_Texture_Deluxemap,
200         DPSOFTRAST_UNIFORM_Texture_Attenuation,
201         DPSOFTRAST_UNIFORM_Texture_Cube,
202         DPSOFTRAST_UNIFORM_Texture_Refraction,
203         DPSOFTRAST_UNIFORM_Texture_Reflection,
204         DPSOFTRAST_UNIFORM_Texture_ShadowMap2D,
205         DPSOFTRAST_UNIFORM_Texture_CubeProjection,
206         DPSOFTRAST_UNIFORM_Texture_ScreenDepth,
207         DPSOFTRAST_UNIFORM_Texture_ScreenNormalMap,
208         DPSOFTRAST_UNIFORM_Texture_ScreenDiffuse,
209         DPSOFTRAST_UNIFORM_Texture_ScreenSpecular,
210         DPSOFTRAST_UNIFORM_Texture_ReflectMask,
211         DPSOFTRAST_UNIFORM_Texture_ReflectCube,
212         DPSOFTRAST_UNIFORM_Alpha,
213         DPSOFTRAST_UNIFORM_BloomBlur_Parameters,
214         DPSOFTRAST_UNIFORM_ClientTime,
215         DPSOFTRAST_UNIFORM_Color_Ambient,
216         DPSOFTRAST_UNIFORM_Color_Diffuse,
217         DPSOFTRAST_UNIFORM_Color_Specular,
218         DPSOFTRAST_UNIFORM_Color_Glow,
219         DPSOFTRAST_UNIFORM_Color_Pants,
220         DPSOFTRAST_UNIFORM_Color_Shirt,
221         DPSOFTRAST_UNIFORM_DeferredColor_Ambient,
222         DPSOFTRAST_UNIFORM_DeferredColor_Diffuse,
223         DPSOFTRAST_UNIFORM_DeferredColor_Specular,
224         DPSOFTRAST_UNIFORM_DeferredMod_Diffuse,
225         DPSOFTRAST_UNIFORM_DeferredMod_Specular,
226         DPSOFTRAST_UNIFORM_DistortScaleRefractReflect,
227         DPSOFTRAST_UNIFORM_EyePosition,
228         DPSOFTRAST_UNIFORM_FogColor,
229         DPSOFTRAST_UNIFORM_FogHeightFade,
230         DPSOFTRAST_UNIFORM_FogPlane,
231         DPSOFTRAST_UNIFORM_FogPlaneViewDist,
232         DPSOFTRAST_UNIFORM_FogRangeRecip,
233         DPSOFTRAST_UNIFORM_LightColor,
234         DPSOFTRAST_UNIFORM_LightDir,
235         DPSOFTRAST_UNIFORM_LightPosition,
236         DPSOFTRAST_UNIFORM_OffsetMapping_Scale,
237         DPSOFTRAST_UNIFORM_PixelSize,
238         DPSOFTRAST_UNIFORM_ReflectColor,
239         DPSOFTRAST_UNIFORM_ReflectFactor,
240         DPSOFTRAST_UNIFORM_ReflectOffset,
241         DPSOFTRAST_UNIFORM_RefractColor,
242         DPSOFTRAST_UNIFORM_Saturation,
243         DPSOFTRAST_UNIFORM_ScreenCenterRefractReflect,
244         DPSOFTRAST_UNIFORM_ScreenScaleRefractReflect,
245         DPSOFTRAST_UNIFORM_ScreenToDepth,
246         DPSOFTRAST_UNIFORM_ShadowMap_Parameters,
247         DPSOFTRAST_UNIFORM_ShadowMap_TextureScale,
248         DPSOFTRAST_UNIFORM_SpecularPower,
249         DPSOFTRAST_UNIFORM_UserVec1,
250         DPSOFTRAST_UNIFORM_UserVec2,
251         DPSOFTRAST_UNIFORM_UserVec3,
252         DPSOFTRAST_UNIFORM_UserVec4,
253         DPSOFTRAST_UNIFORM_ViewTintColor,
254         DPSOFTRAST_UNIFORM_ViewToLightM1,
255         DPSOFTRAST_UNIFORM_ViewToLightM2,
256         DPSOFTRAST_UNIFORM_ViewToLightM3,
257         DPSOFTRAST_UNIFORM_ViewToLightM4,
258         DPSOFTRAST_UNIFORM_ModelToLightM1,
259         DPSOFTRAST_UNIFORM_ModelToLightM2,
260         DPSOFTRAST_UNIFORM_ModelToLightM3,
261         DPSOFTRAST_UNIFORM_ModelToLightM4,
262         DPSOFTRAST_UNIFORM_TexMatrixM1,
263         DPSOFTRAST_UNIFORM_TexMatrixM2,
264         DPSOFTRAST_UNIFORM_TexMatrixM3,
265         DPSOFTRAST_UNIFORM_TexMatrixM4,
266         DPSOFTRAST_UNIFORM_BackgroundTexMatrixM1,
267         DPSOFTRAST_UNIFORM_BackgroundTexMatrixM2,
268         DPSOFTRAST_UNIFORM_BackgroundTexMatrixM3,
269         DPSOFTRAST_UNIFORM_BackgroundTexMatrixM4,
270         DPSOFTRAST_UNIFORM_ModelViewProjectionMatrixM1,
271         DPSOFTRAST_UNIFORM_ModelViewProjectionMatrixM2,
272         DPSOFTRAST_UNIFORM_ModelViewProjectionMatrixM3,
273         DPSOFTRAST_UNIFORM_ModelViewProjectionMatrixM4,
274         DPSOFTRAST_UNIFORM_ModelViewMatrixM1,
275         DPSOFTRAST_UNIFORM_ModelViewMatrixM2,
276         DPSOFTRAST_UNIFORM_ModelViewMatrixM3,
277         DPSOFTRAST_UNIFORM_ModelViewMatrixM4,
278         DPSOFTRAST_UNIFORM_PixelToScreenTexCoord,
279         DPSOFTRAST_UNIFORM_ModelToReflectCubeM1,
280         DPSOFTRAST_UNIFORM_ModelToReflectCubeM2,
281         DPSOFTRAST_UNIFORM_ModelToReflectCubeM3,
282         DPSOFTRAST_UNIFORM_ModelToReflectCubeM4,
283         DPSOFTRAST_UNIFORM_ShadowMapMatrixM1,
284         DPSOFTRAST_UNIFORM_ShadowMapMatrixM2,
285         DPSOFTRAST_UNIFORM_ShadowMapMatrixM3,
286         DPSOFTRAST_UNIFORM_ShadowMapMatrixM4,
287         DPSOFTRAST_UNIFORM_BloomColorSubtract,
288         DPSOFTRAST_UNIFORM_NormalmapScrollBlend,
289         DPSOFTRAST_UNIFORM_TOTAL
290 }
291 DPSOFTRAST_UNIFORM;
292
293 void DPSOFTRAST_SetShader(unsigned int mode, unsigned int permutation);
294 #define DPSOFTRAST_Uniform1fARB(index, v0) DPSOFTRAST_Uniform4fARB(index, v0, 0, 0, 0)
295 #define DPSOFTRAST_Uniform2fARB(index, v0, v1) DPSOFTRAST_Uniform4fARB(index, v0, v1, 0, 0)
296 #define DPSOFTRAST_Uniform3fARB(index, v0, v1, v2) DPSOFTRAST_Uniform4fARB(index, v0, v1, v2, 0)
297 void DPSOFTRAST_Uniform4fARB(DPSOFTRAST_UNIFORM index, float v0, float v1, float v2, float v3);
298 void DPSOFTRAST_Uniform4fvARB(DPSOFTRAST_UNIFORM index, const float *v);
299 void DPSOFTRAST_UniformMatrix4fvARB(DPSOFTRAST_UNIFORM index, int arraysize, int transpose, const float *v);
300 void DPSOFTRAST_Uniform1iARB(DPSOFTRAST_UNIFORM index, int i0);
301
302 void DPSOFTRAST_DrawTriangles(int firstvertex, int numvertices, int numtriangles, const int *element3i, const unsigned short *element3s);
303
304 #endif // DPSOFTRAST_H