void R_Init(void);
void R_UpdateVariables(void); // must call after setting up most of r_refdef, but before calling R_RenderView
void R_RenderView(void); // must set r_refdef and call R_UpdateVariables first
+void R_RenderView_UpdateViewVectors(void); // just updates r_refdef.view.{forward,left,up,origin,right,inverse_matrix}
typedef enum r_refdef_scene_type_s {
RST_CLIENT,
}
rsurfacepass_t;
-void R_SetupShader_Generic(rtexture_t *first, rtexture_t *second, int texturemode, int rgbscale, qboolean usegamma, qboolean notrippy);
+void R_SetupShader_Generic(rtexture_t *first, rtexture_t *second, int texturemode, int rgbscale, qboolean usegamma, qboolean notrippy, qboolean suppresstexalpha);
+void R_SetupShader_Generic_NoTexture(qboolean usegamma, qboolean notrippy);
void R_SetupShader_DepthOrShadow(qboolean notrippy);
void R_SetupShader_ShowDepth(qboolean notrippy);
void R_SetupShader_Surface(const vec3_t lightcolorbase, qboolean modellighting, float ambientscale, float diffusescale, float specularscale, rsurfacepass_t rsurfacepass, int texturenumsurfaces, const msurface_t **texturesurfacelist, void *waterplane, qboolean notrippy);
typedef struct r_waterstate_waterplane_s
{
- rtexture_t *texture_refraction;
- rtexture_t *texture_reflection;
- rtexture_t *texture_camera;
+ rtexture_t *texture_refraction; // MATERIALFLAG_WATERSHADER or MATERIALFLAG_REFRACTION
+ rtexture_t *texture_reflection; // MATERIALFLAG_WATERSHADER or MATERIALFLAG_REFLECTION
+ rtexture_t *texture_camera; // MATERIALFLAG_CAMERA
+ int fbo_refraction;
+ int fbo_reflection;
+ int fbo_camera;
mplane_t plane;
int materialflags; // combined flags of all water surfaces on this plane
unsigned char pvsbits[(MAX_MAP_LEAFS+7)>>3]; // FIXME: buffer overflow on huge maps
typedef struct r_waterstate_s
{
- qboolean enabled;
-
- qboolean renderingscene; // true while rendering a refraction or reflection texture, disables water surfaces
- qboolean hideplayer;
-
int waterwidth, waterheight;
int texturewidth, textureheight;
int camerawidth, cameraheight;
+ rtexture_t *depthtexture;
int maxwaterplanes; // same as MAX_WATERPLANES
int numwaterplanes;
float screenscale[2];
float screencenter[2];
+
+ qboolean enabled;
+
+ qboolean renderingscene; // true while rendering a refraction or reflection texture, disables water surfaces
+ qboolean hideplayer;
}
r_waterstate_t;
typedef struct r_framebufferstate_s
{
- qboolean enabled;
- qboolean hdr;
-
- int bloomwidth, bloomheight;
+ textype_t textype; // type of color buffer we're using (dependent on r_viewfbo cvar)
+ int fbo; // non-zero if r_viewfbo is enabled and working
+ int screentexturewidth, screentextureheight; // dimensions of texture
- textype_t texturetype;
- int viewfbo; // used to check if r_viewfbo cvar has changed
-
- int fbo_framebuffer; // non-zero if r_viewfbo is enabled and working
- rtexture_t *texture_framebuffercolor; // non-NULL if fbo_screen is non-zero
- rtexture_t *texture_framebufferdepth; // non-NULL if fbo_screen is non-zero
-
- int screentexturewidth, screentextureheight;
- rtexture_t *texture_screen; /// \note also used for motion blur if enabled!
+ rtexture_t *colortexture; // non-NULL if fbo is non-zero
+ rtexture_t *depthtexture; // non-NULL if fbo is non-zero
+ rtexture_t *ghosttexture; // for r_motionblur (not recommended on multi-GPU hardware!)
+ rtexture_t *bloomtexture[2]; // for r_bloom, multi-stage processing
+ int bloomfbo[2]; // fbos for rendering into bloomtexture[]
+ int bloomindex; // which bloomtexture[] contains the final image
+ int bloomwidth, bloomheight;
int bloomtexturewidth, bloomtextureheight;
- rtexture_t *texture_bloom;
// arrays for rendering the screen passes
- float screentexcoord2f[8];
- float bloomtexcoord2f[8];
- float offsettexcoord2f[8];
+ float screentexcoord2f[8]; // texcoords for colortexture or ghosttexture
+ float bloomtexcoord2f[8]; // texcoords for bloomtexture[]
+ float offsettexcoord2f[8]; // temporary use while updating bloomtexture[]
- r_viewport_t viewport;
+ r_viewport_t bloomviewport;
r_waterstate_t water;
+
+ qboolean ghosttexture_valid; // don't draw garbage on first frame with motionblur
}
r_framebufferstate_t;
extern r_framebufferstate_t r_fb;
-void R_ResetViewRendering2D(void);
-void R_ResetViewRendering3D(void);
-void R_SetupView(qboolean allowwaterclippingplane);
+void R_ResetViewRendering2D_Common(int fbo, rtexture_t *depthtexture, rtexture_t *colortexture, float x2, float y2); // this is called by R_ResetViewRendering2D and _DrawQ_Setup and internal
+void R_ResetViewRendering2D(int fbo, rtexture_t *depthtexture, rtexture_t *colortexture);
+void R_ResetViewRendering3D(int fbo, rtexture_t *depthtexture, rtexture_t *colortexture);
+void R_SetupView(qboolean allowwaterclippingplane, int fbo, rtexture_t *depthtexture, rtexture_t *colortexture);
extern const float r_screenvertex3f[12];
extern cvar_t r_shadows;
extern cvar_t r_shadows_darken;