From: cloudwalk Date: Tue, 29 Sep 2020 19:19:01 +0000 (+0000) Subject: client: Move r_refdef structs and renderer prototypes to render.h X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=eac7237bf4c295d07b7e47384a5ba13d183924a3;p=xonotic%2Fdarkplaces.git client: Move r_refdef structs and renderer prototypes to render.h git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@12963 d7cf8633-e32d-0410-b094-e92efae38249 --- diff --git a/client.h b/client.h index 823d8b46..e3be51c7 100644 --- a/client.h +++ b/client.h @@ -1734,264 +1734,11 @@ void CL_ParticleRain (const vec3_t mins, const vec3_t maxs, const vec3_t dir, in void CL_EntityParticles (const entity_t *ent); void CL_ParticleExplosion (const vec3_t org); void CL_ParticleExplosion2 (const vec3_t org, int colorStart, int colorLength); -void R_NewExplosion(const vec3_t org); #include "cl_screen.h" extern qbool sb_showscores; -float RSurf_FogVertex(const vec3_t p); -float RSurf_FogPoint(const vec3_t p); - -typedef enum r_viewport_type_e -{ - R_VIEWPORTTYPE_ORTHO, - R_VIEWPORTTYPE_PERSPECTIVE, - R_VIEWPORTTYPE_PERSPECTIVE_INFINITEFARCLIP, - R_VIEWPORTTYPE_PERSPECTIVECUBESIDE, - R_VIEWPORTTYPE_TOTAL -} -r_viewport_type_t; - -typedef struct r_viewport_s -{ - matrix4x4_t cameramatrix; // from entity (transforms from camera entity to world) - matrix4x4_t viewmatrix; // actual matrix for rendering (transforms to viewspace) - matrix4x4_t projectmatrix; // actual projection matrix (transforms from viewspace to screen) - int x; - int y; - int z; - int width; - int height; - int depth; - r_viewport_type_t type; - float screentodepth[2]; // used by deferred renderer to calculate linear depth from device depth coordinates -} -r_viewport_t; - -typedef struct r_refdef_view_s -{ - // view information (changes multiple times per frame) - // if any of these variables change then r_refdef.viewcache must be regenerated - // by calling R_View_Update - // (which also updates viewport, scissor, colormask) - - // it is safe and expected to copy this into a structure on the stack and - // call the renderer recursively, then restore from the stack afterward - // (as long as R_View_Update is called) - - // eye position information - matrix4x4_t matrix, inverse_matrix; - vec3_t origin; - vec3_t forward; - vec3_t left; - vec3_t right; - vec3_t up; - int numfrustumplanes; - mplane_t frustum[6]; - qbool useclipplane; - qbool usecustompvs; // uses r_refdef.viewcache.pvsbits as-is rather than computing it - mplane_t clipplane; - float frustum_x, frustum_y; - vec3_t frustumcorner[4]; - // if turned off it renders an ortho view - int useperspective; - // allows visibility culling based on the view origin (e.g. pvs and R_CanSeeBox) - // this is turned off by: - // r_trippy - // !r_refdef.view.useperspective - // (sometimes) r_refdef.view.useclipplane - int usevieworiginculling; - float ortho_x, ortho_y; - - // screen area to render in - int x; - int y; - int z; - int width; - int height; - int depth; - r_viewport_t viewport; // note: if r_viewscale is used, the viewport.width and viewport.height may be less than width and height - - // which color components to allow (for anaglyph glasses) - int colormask[4]; - - // global RGB color multiplier for rendering - float colorscale; - - // whether to call R_ClearScreen before rendering stuff - qbool clear; - // if true, don't clear or do any post process effects (bloom, etc) - qbool isoverlay; - // if true, this is the MAIN view (which is, after CSQC, copied into the scene for use e.g. by r_speeds 1, showtex, prydon cursor) - qbool ismain; - - // whether to draw r_showtris and such, this is only true for the main - // view render, all secondary renders (mirrors, portals, cameras, - // distortion effects, etc) omit such debugging information - qbool showdebug; - - // these define which values to use in GL_CullFace calls to request frontface or backface culling - int cullface_front; - int cullface_back; - - // render quality (0 to 1) - affects r_drawparticles_drawdistance and others - float quality; -} -r_refdef_view_t; - -typedef struct r_refdef_viewcache_s -{ - // updated by gl_main_newmap() - int maxentities; - int world_numclusters; - int world_numclusterbytes; - int world_numleafs; - int world_numsurfaces; - - // these properties are generated by R_View_Update() - - // which entities are currently visible for this viewpoint - // (the used range is 0...r_refdef.scene.numentities) - unsigned char *entityvisible; - - // flag arrays used for visibility checking on world model - // (all other entities have no per-surface/per-leaf visibility checks) - unsigned char *world_pvsbits; - unsigned char *world_leafvisible; - unsigned char *world_surfacevisible; - // if true, the view is currently in a leaf without pvs data - qbool world_novis; -} -r_refdef_viewcache_t; - -// TODO: really think about which fields should go into scene and which one should stay in refdef [1/7/2008 Black] -// maybe also refactor some of the functions to support different setting sources (ie. fogenabled, etc.) for different scenes -typedef struct r_refdef_scene_s { - // whether to call S_ExtraUpdate during render to reduce sound chop - qbool extraupdate; - - // (client gameworld) time for rendering time based effects - double time; - - // the world - entity_render_t *worldentity; - - // same as worldentity->model - dp_model_t *worldmodel; - - // renderable entities (excluding world) - entity_render_t **entities; - int numentities; - int maxentities; - - // field of temporary entities that is reset each (client) frame - entity_render_t *tempentities; - int numtempentities; - int maxtempentities; - qbool expandtempentities; - - // renderable dynamic lights - rtlight_t *lights[MAX_DLIGHTS]; - rtlight_t templights[MAX_DLIGHTS]; - int numlights; - - // intensities for light styles right now, controls rtlights - float rtlightstylevalue[MAX_LIGHTSTYLES]; // float fraction of base light value - // 8.8bit fixed point intensities for light styles - // controls intensity lightmap layers - unsigned short lightstylevalue[MAX_LIGHTSTYLES]; // 8.8 fraction of base light value - - // adds brightness to the whole scene, separate from lightmapintensity - // see CL_UpdateEntityShading - float ambientintensity; - // brightness of lightmap and modellight lighting on materials - // see CL_UpdateEntityShading - float lightmapintensity; - - qbool rtworld; - qbool rtworldshadows; - qbool rtdlight; - qbool rtdlightshadows; -} r_refdef_scene_t; - -typedef struct r_refdef_s -{ - // these fields define the basic rendering information for the world - // but not the view, which could change multiple times in one rendered - // frame (for example when rendering textures for certain effects) - - // these are set for water warping before - // frustum_x/frustum_y are calculated - float frustumscale_x, frustumscale_y; - - // current view settings (these get reset a few times during rendering because of water rendering, reflections, etc) - r_refdef_view_t view; - r_refdef_viewcache_t viewcache; - - // minimum visible distance (pixels closer than this disappear) - double nearclip; - // maximum visible distance (pixels further than this disappear in 16bpp modes, - // in 32bpp an infinite-farclip matrix is used instead) - double farclip; - - // fullscreen color blend - float viewblend[4]; - - r_refdef_scene_t scene; - - float fogplane[4]; - float fogplaneviewdist; - qbool fogplaneviewabove; - float fogheightfade; - float fogcolor[3]; - float fogrange; - float fograngerecip; - float fogmasktabledistmultiplier; -#define FOGMASKTABLEWIDTH 1024 - float fogmasktable[FOGMASKTABLEWIDTH]; - float fogmasktable_start, fogmasktable_alpha, fogmasktable_range, fogmasktable_density; - float fog_density; - float fog_red; - float fog_green; - float fog_blue; - float fog_alpha; - float fog_start; - float fog_end; - float fog_height; - float fog_fadedepth; - qbool fogenabled; - qbool oldgl_fogenable; - - // new flexible texture height fog (overrides normal fog) - char fog_height_texturename[64]; // note: must be 64 for the sscanf code - unsigned char *fog_height_table1d; - unsigned char *fog_height_table2d; - int fog_height_tablesize; // enable - float fog_height_tablescale; - float fog_height_texcoordscale; - char fogheighttexturename[64]; // detects changes to active fog height texture - - int draw2dstage; // 0 = no, 1 = yes, other value = needs setting up again - - // true during envmap command capture - qbool envmap; - - // whether to draw world lights realtime, dlights realtime, and their shadows - float polygonfactor; - float polygonoffset; - - // how long R_RenderView took on the previous frame - double lastdrawscreentime; - - // rendering stats for r_speeds display - // (these are incremented in many places) - int stats[r_stat_count]; -} -r_refdef_t; - -extern r_refdef_t r_refdef; - typedef enum waterlevel_e { WATERLEVEL_NONE, diff --git a/render.h b/render.h index 459693fc..3b70f903 100644 --- a/render.h +++ b/render.h @@ -204,16 +204,269 @@ extern cvar_t r_fullbright; extern cvar_t r_wateralpha; extern cvar_t r_dynamic; +void R_NewExplosion(const vec3_t org); void R_UpdateVariables(void); // must call after setting up most of r_refdef, but before calling R_RenderView void R_RenderView(int fbo, rtexture_t *depthtexture, rtexture_t *colortexture, int x, int y, int width, int height); // must set r_refdef and call R_UpdateVariables and CL_UpdateEntityShading first void R_RenderView_UpdateViewVectors(void); // just updates r_refdef.view.{forward,left,up,origin,right,inverse_matrix} +float RSurf_FogVertex(const vec3_t p); +float RSurf_FogPoint(const vec3_t p); + typedef enum r_refdef_scene_type_s { RST_CLIENT, RST_MENU, RST_COUNT } r_refdef_scene_type_t; +typedef enum r_viewport_type_e +{ + R_VIEWPORTTYPE_ORTHO, + R_VIEWPORTTYPE_PERSPECTIVE, + R_VIEWPORTTYPE_PERSPECTIVE_INFINITEFARCLIP, + R_VIEWPORTTYPE_PERSPECTIVECUBESIDE, + R_VIEWPORTTYPE_TOTAL +} +r_viewport_type_t; + +typedef struct r_viewport_s +{ + matrix4x4_t cameramatrix; // from entity (transforms from camera entity to world) + matrix4x4_t viewmatrix; // actual matrix for rendering (transforms to viewspace) + matrix4x4_t projectmatrix; // actual projection matrix (transforms from viewspace to screen) + int x; + int y; + int z; + int width; + int height; + int depth; + r_viewport_type_t type; + float screentodepth[2]; // used by deferred renderer to calculate linear depth from device depth coordinates +} +r_viewport_t; + +typedef struct r_refdef_view_s +{ + // view information (changes multiple times per frame) + // if any of these variables change then r_refdef.viewcache must be regenerated + // by calling R_View_Update + // (which also updates viewport, scissor, colormask) + + // it is safe and expected to copy this into a structure on the stack and + // call the renderer recursively, then restore from the stack afterward + // (as long as R_View_Update is called) + + // eye position information + matrix4x4_t matrix, inverse_matrix; + vec3_t origin; + vec3_t forward; + vec3_t left; + vec3_t right; + vec3_t up; + int numfrustumplanes; + mplane_t frustum[6]; + qbool useclipplane; + qbool usecustompvs; // uses r_refdef.viewcache.pvsbits as-is rather than computing it + mplane_t clipplane; + float frustum_x, frustum_y; + vec3_t frustumcorner[4]; + // if turned off it renders an ortho view + int useperspective; + // allows visibility culling based on the view origin (e.g. pvs and R_CanSeeBox) + // this is turned off by: + // r_trippy + // !r_refdef.view.useperspective + // (sometimes) r_refdef.view.useclipplane + int usevieworiginculling; + float ortho_x, ortho_y; + + // screen area to render in + int x; + int y; + int z; + int width; + int height; + int depth; + r_viewport_t viewport; // note: if r_viewscale is used, the viewport.width and viewport.height may be less than width and height + + // which color components to allow (for anaglyph glasses) + int colormask[4]; + + // global RGB color multiplier for rendering + float colorscale; + + // whether to call R_ClearScreen before rendering stuff + qbool clear; + // if true, don't clear or do any post process effects (bloom, etc) + qbool isoverlay; + // if true, this is the MAIN view (which is, after CSQC, copied into the scene for use e.g. by r_speeds 1, showtex, prydon cursor) + qbool ismain; + + // whether to draw r_showtris and such, this is only true for the main + // view render, all secondary renders (mirrors, portals, cameras, + // distortion effects, etc) omit such debugging information + qbool showdebug; + + // these define which values to use in GL_CullFace calls to request frontface or backface culling + int cullface_front; + int cullface_back; + + // render quality (0 to 1) - affects r_drawparticles_drawdistance and others + float quality; +} +r_refdef_view_t; + +typedef struct r_refdef_viewcache_s +{ + // updated by gl_main_newmap() + int maxentities; + int world_numclusters; + int world_numclusterbytes; + int world_numleafs; + int world_numsurfaces; + + // these properties are generated by R_View_Update() + + // which entities are currently visible for this viewpoint + // (the used range is 0...r_refdef.scene.numentities) + unsigned char *entityvisible; + + // flag arrays used for visibility checking on world model + // (all other entities have no per-surface/per-leaf visibility checks) + unsigned char *world_pvsbits; + unsigned char *world_leafvisible; + unsigned char *world_surfacevisible; + // if true, the view is currently in a leaf without pvs data + qbool world_novis; +} +r_refdef_viewcache_t; + +// TODO: really think about which fields should go into scene and which one should stay in refdef [1/7/2008 Black] +// maybe also refactor some of the functions to support different setting sources (ie. fogenabled, etc.) for different scenes +typedef struct r_refdef_scene_s { + // whether to call S_ExtraUpdate during render to reduce sound chop + qbool extraupdate; + + // (client gameworld) time for rendering time based effects + double time; + + // the world + entity_render_t *worldentity; + + // same as worldentity->model + dp_model_t *worldmodel; + + // renderable entities (excluding world) + entity_render_t **entities; + int numentities; + int maxentities; + + // field of temporary entities that is reset each (client) frame + entity_render_t *tempentities; + int numtempentities; + int maxtempentities; + qbool expandtempentities; + + // renderable dynamic lights + rtlight_t *lights[MAX_DLIGHTS]; + rtlight_t templights[MAX_DLIGHTS]; + int numlights; + + // intensities for light styles right now, controls rtlights + float rtlightstylevalue[MAX_LIGHTSTYLES]; // float fraction of base light value + // 8.8bit fixed point intensities for light styles + // controls intensity lightmap layers + unsigned short lightstylevalue[MAX_LIGHTSTYLES]; // 8.8 fraction of base light value + + // adds brightness to the whole scene, separate from lightmapintensity + // see CL_UpdateEntityShading + float ambientintensity; + // brightness of lightmap and modellight lighting on materials + // see CL_UpdateEntityShading + float lightmapintensity; + + qbool rtworld; + qbool rtworldshadows; + qbool rtdlight; + qbool rtdlightshadows; +} r_refdef_scene_t; + +typedef struct r_refdef_s +{ + // these fields define the basic rendering information for the world + // but not the view, which could change multiple times in one rendered + // frame (for example when rendering textures for certain effects) + + // these are set for water warping before + // frustum_x/frustum_y are calculated + float frustumscale_x, frustumscale_y; + + // current view settings (these get reset a few times during rendering because of water rendering, reflections, etc) + r_refdef_view_t view; + r_refdef_viewcache_t viewcache; + + // minimum visible distance (pixels closer than this disappear) + double nearclip; + // maximum visible distance (pixels further than this disappear in 16bpp modes, + // in 32bpp an infinite-farclip matrix is used instead) + double farclip; + + // fullscreen color blend + float viewblend[4]; + + r_refdef_scene_t scene; + + float fogplane[4]; + float fogplaneviewdist; + qbool fogplaneviewabove; + float fogheightfade; + float fogcolor[3]; + float fogrange; + float fograngerecip; + float fogmasktabledistmultiplier; +#define FOGMASKTABLEWIDTH 1024 + float fogmasktable[FOGMASKTABLEWIDTH]; + float fogmasktable_start, fogmasktable_alpha, fogmasktable_range, fogmasktable_density; + float fog_density; + float fog_red; + float fog_green; + float fog_blue; + float fog_alpha; + float fog_start; + float fog_end; + float fog_height; + float fog_fadedepth; + qbool fogenabled; + qbool oldgl_fogenable; + + // new flexible texture height fog (overrides normal fog) + char fog_height_texturename[64]; // note: must be 64 for the sscanf code + unsigned char *fog_height_table1d; + unsigned char *fog_height_table2d; + int fog_height_tablesize; // enable + float fog_height_tablescale; + float fog_height_texcoordscale; + char fogheighttexturename[64]; // detects changes to active fog height texture + + int draw2dstage; // 0 = no, 1 = yes, other value = needs setting up again + + // true during envmap command capture + qbool envmap; + + // whether to draw world lights realtime, dlights realtime, and their shadows + float polygonfactor; + float polygonoffset; + + // how long R_RenderView took on the previous frame + double lastdrawscreentime; + + // rendering stats for r_speeds display + // (these are incremented in many places) + int stats[r_stat_count]; +} +r_refdef_t; + +extern r_refdef_t r_refdef; + void R_SelectScene( r_refdef_scene_type_t scenetype ); r_refdef_scene_t * R_GetScenePointer( r_refdef_scene_type_t scenetype );