-struct entity_render_s;
-struct texture_s;
-struct msurface_s;
-void R_UpdateTextureInfo(const entity_render_t *ent, texture_t *t);
-void R_UpdateAllTextureInfo(entity_render_t *ent);
-void R_QueueTextureSurfaceList(int texturenumsurfaces, msurface_t **texturesurfacelist);
-void R_DrawWorldSurfaces(qboolean skysurfaces, qboolean writedepth, qboolean depthonly);
-void R_DrawModelSurfaces(entity_render_t *ent, qboolean skysurfaces, qboolean writedepth, qboolean depthonly);
-
-void RSurf_PrepareVerticesForBatch(qboolean generatenormals, qboolean generatetangents, int texturenumsurfaces, msurface_t **texturesurfacelist);
-void RSurf_DrawBatch_Simple(int texturenumsurfaces, msurface_t **texturesurfacelist);
-
-#define SHADERPERMUTATION_MODE_LIGHTSOURCE (1<<0) // (lightsource) use directional pixel shading from light source (rtlight)
-#define SHADERPERMUTATION_MODE_LIGHTDIRECTIONMAP_MODELSPACE (1<<1) // (lightmap) use directional pixel shading from texture containing modelspace light directions (deluxemap)
-#define SHADERPERMUTATION_MODE_LIGHTDIRECTIONMAP_TANGENTSPACE (1<<2) // (lightmap) use directional pixel shading from texture containing tangentspace light directions (deluxemap)
-#define SHADERPERMUTATION_MODE_LIGHTDIRECTION (1<<3) // (lightmap) use directional pixel shading from fixed light direction (q3bsp)
-#define SHADERPERMUTATION_GLOW (1<<4) // (lightmap) blend in an additive glow texture
-#define SHADERPERMUTATION_FOG (1<<5) // tint the color by fog color or black if using additive blend mode
-#define SHADERPERMUTATION_COLORMAPPING (1<<6) // indicates this is a colormapped skin
-#define SHADERPERMUTATION_DIFFUSE (1<<7) // (lightsource) whether to use directional shading
-#define SHADERPERMUTATION_CONTRASTBOOST (1<<8) // r_glsl_contrastboost boosts the contrast at low color levels (similar to gamma)
-#define SHADERPERMUTATION_SPECULAR (1<<9) // (lightsource or deluxemapping) render specular effects
-#define SHADERPERMUTATION_CUBEFILTER (1<<10) // (lightsource) use cubemap light filter
-#define SHADERPERMUTATION_OFFSETMAPPING (1<<11) // adjust texcoords to roughly simulate a displacement mapped surface
-#define SHADERPERMUTATION_OFFSETMAPPING_RELIEFMAPPING (1<<12) // adjust texcoords to accurately simulate a displacement mapped surface (requires OFFSETMAPPING to also be set!)
-
-#define SHADERPERMUTATION_MAX (1<<13) // how many permutations are possible
-#define SHADERPERMUTATION_MASK (SHADERPERMUTATION_MAX - 1) // mask of valid indexing bits for r_glsl_permutations[] array
-
-// these are additional flags used only by R_GLSL_CompilePermutation
-#define SHADERPERMUTATION_USES_VERTEXSHADER (1<<29)
-#define SHADERPERMUTATION_USES_GEOMETRYSHADER (1<<30)
-#define SHADERPERMUTATION_USES_FRAGMENTSHADER (1<<31)
-
-typedef struct r_glsl_permutation_s
+texture_t *R_GetCurrentTexture(texture_t *t);
+void R_DrawWorldSurfaces(qboolean skysurfaces, qboolean writedepth, qboolean depthonly, qboolean debug, qboolean prepass);
+void R_DrawModelSurfaces(entity_render_t *ent, qboolean skysurfaces, qboolean writedepth, qboolean depthonly, qboolean debug, qboolean prepass);
+void R_AddWaterPlanes(entity_render_t *ent);
+void R_DrawCustomSurface(skinframe_t *skinframe, const matrix4x4_t *texmatrix, int materialflags, int firstvertex, int numvertices, int firsttriangle, int numtriangles, qboolean writedepth, qboolean prepass);
+void R_DrawCustomSurface_Texture(texture_t *texture, const matrix4x4_t *texmatrix, int materialflags, int firstvertex, int numvertices, int firsttriangle, int numtriangles, qboolean writedepth, qboolean prepass);
+
+void RSurf_PrepareVerticesForBatch(qboolean generatenormals, qboolean generatetangents, int texturenumsurfaces, const msurface_t **texturesurfacelist);
+void RSurf_DrawBatch_Simple(int texturenumsurfaces, const msurface_t **texturesurfacelist);
+
+void R_DecalSystem_SplatEntities(const vec3_t org, const vec3_t normal, float r, float g, float b, float a, float s1, float t1, float s2, float t2, float size);
+
+typedef enum rsurfacepass_e
+{
+ RSURFPASS_BASE,
+ RSURFPASS_BACKGROUND,
+ RSURFPASS_RTLIGHT,
+ RSURFPASS_DEFERREDGEOMETRY,
+}
+rsurfacepass_t;
+
+typedef enum gl20_texunit_e
+{
+ // postprocess shaders, and generic shaders:
+ GL20TU_FIRST = 0,
+ GL20TU_SECOND = 1,
+ GL20TU_GAMMARAMPS = 2,
+ // standard material properties
+ GL20TU_NORMAL = 0,
+ GL20TU_COLOR = 1,
+ GL20TU_GLOSS = 2,
+ GL20TU_GLOW = 3,
+ // material properties for a second material
+ GL20TU_SECONDARY_NORMAL = 4,
+ GL20TU_SECONDARY_COLOR = 5,
+ GL20TU_SECONDARY_GLOSS = 6,
+ GL20TU_SECONDARY_GLOW = 7,
+ // material properties for a colormapped material
+ // conflicts with secondary material
+ GL20TU_PANTS = 4,
+ GL20TU_SHIRT = 5,
+ // fog fade in the distance
+ GL20TU_FOGMASK = 8,
+ // compiled ambient lightmap and deluxemap
+ GL20TU_LIGHTMAP = 9,
+ GL20TU_DELUXEMAP = 10,
+ // refraction, used by water shaders
+ GL20TU_REFRACTION = 3,
+ // reflection, used by water shaders, also with normal material rendering
+ // conflicts with secondary material
+ GL20TU_REFLECTION = 7,
+ // rtlight attenuation (distance fade) and cubemap filter (projection texturing)
+ // conflicts with lightmap/deluxemap
+ GL20TU_ATTENUATION = 9,
+ GL20TU_CUBE = 10,
+ GL20TU_SHADOWMAPRECT = 11,
+ GL20TU_SHADOWMAPCUBE = 11,
+ GL20TU_SHADOWMAP2D = 11,
+ GL20TU_CUBEPROJECTION = 12,
+ // orthographic-projection shadowmapping, reuses prepass screenspace depth, so must fix later if the two could ever coexist during final deferred lighting pass
+ GL20TU_SHADOWMAPORTHORECT = 13,
+ GL20TU_SHADOWMAPORTHO2D = 13,
+ // rtlight prepass data (screenspace depth and normalmap)
+ GL20TU_SCREENDEPTH = 13,
+ GL20TU_SCREENNORMALMAP = 14,
+ // lightmap prepass data (screenspace diffuse and specular from lights)
+ GL20TU_SCREENDIFFUSE = 11,
+ GL20TU_SCREENSPECULAR = 12,
+ // fake reflections
+ GL20TU_REFLECTMASK = 14,
+ GL20TU_REFLECTCUBE = 15
+}
+gl20_texunit;
+
+void R_SetupShader_Generic(rtexture_t *first, rtexture_t *second, int texturemode, int rgbscale);
+void R_SetupShader_DepthOrShadow(void);
+void R_SetupShader_ShowDepth(void);
+void R_SetupShader_Surface(const vec3_t lightcolorbase, qboolean modellighting, float ambientscale, float diffusescale, float specularscale, rsurfacepass_t rsurfacepass);
+void R_SetupShader_DeferredLight(const rtlight_t *rtlight);
+
+typedef struct r_waterstate_waterplane_s