From 7ee915963835272e293f8241a5e7d2182ded9d7c Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Thu, 17 Mar 2022 12:00:43 +0900 Subject: [PATCH] [renderer] Move common R_SetupFrame code to r_screen The code is really part of scene (not a typo wrt r_screen: that is misnamed as such, or at least SCR_UpdateScreen needs to be split into screen (2d overlay, really) and scene updates). This breaks fisheye rendering as the fisheye code calls the actual scene render code multiple times, but the fisheye code is called by said scene render code via a diversion. The fisheye needs to be moved out to the high level scene render, but that will takes some extra work for frame buffer setup. --- libs/video/renderer/gl/gl_rmain.c | 15 ------------ libs/video/renderer/glsl/glsl_main.c | 15 ------------ libs/video/renderer/r_screen.c | 31 ++++++++++++++++++------ libs/video/renderer/sw/sw_rmisc.c | 9 ------- libs/video/renderer/vulkan/vulkan_main.c | 14 ----------- 5 files changed, 23 insertions(+), 61 deletions(-) diff --git a/libs/video/renderer/gl/gl_rmain.c b/libs/video/renderer/gl/gl_rmain.c index b45ea5acf..36a7ed133 100644 --- a/libs/video/renderer/gl/gl_rmain.c +++ b/libs/video/renderer/gl/gl_rmain.c @@ -240,20 +240,6 @@ R_DrawViewModel (void) qfglDepthRange (gldepthmin, gldepthmax); } -static void -gl_R_SetupFrame (void) -{ - R_AnimateLight (); - EntQueue_Clear (r_ent_queue); - r_framecount++; - - vec4f_t position = r_refdef.frame.position; - - R_SetFrustum (); - - r_refdef.viewleaf = Mod_PointInLeaf (&position[0], r_refdef.worldmodel); -} - static void MYgluPerspective (GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar) @@ -336,7 +322,6 @@ R_RenderScene (void) if (r_timegraph->int_val || r_speeds->int_val || r_dspeeds->int_val) r_time1 = Sys_DoubleTime (); - gl_R_SetupFrame (); R_SetupGL (); gl_Fog_EnableGFog (); diff --git a/libs/video/renderer/glsl/glsl_main.c b/libs/video/renderer/glsl/glsl_main.c index e90578ad1..54cef78b2 100644 --- a/libs/video/renderer/glsl/glsl_main.c +++ b/libs/video/renderer/glsl/glsl_main.c @@ -93,20 +93,6 @@ glsl_R_ViewChanged (void) mmulf (proj, depth_range, proj); } -static void -glsl_R_SetupFrame (void) -{ - R_AnimateLight (); - EntQueue_Clear (r_ent_queue); - r_framecount++; - - vec4f_t position = r_refdef.frame.position; - - R_SetFrustum (); - - r_refdef.viewleaf = Mod_PointInLeaf (&position[0], r_refdef.worldmodel); -} - static void R_SetupView (void) { @@ -188,7 +174,6 @@ glsl_R_RenderView (void) if (speeds) t[0] = Sys_DoubleTime (); - glsl_R_SetupFrame (); R_SetupView (); if (speeds) t[1] = Sys_DoubleTime (); diff --git a/libs/video/renderer/r_screen.c b/libs/video/renderer/r_screen.c index 938b5f3a8..611ba885f 100644 --- a/libs/video/renderer/r_screen.c +++ b/libs/video/renderer/r_screen.c @@ -48,6 +48,7 @@ #include "QF/sys.h" #include "QF/va.h" +#include "QF/scene/entity.h" #include "QF/scene/transform.h" #include "QF/ui/view.h" @@ -160,13 +161,15 @@ SCR_UpdateScreen (transform_t *camera, double realtime, SCR_Func *scr_funcs) return; } + refdef_t *refdef = r_data->refdef; if (camera) { - Transform_GetWorldMatrix (camera, r_data->refdef->camera); - Transform_GetWorldInverse (camera, r_data->refdef->camera_inverse); + Transform_GetWorldMatrix (camera, refdef->camera); + Transform_GetWorldInverse (camera, refdef->camera_inverse); } else { - mat4fidentity (r_data->refdef->camera); - mat4fidentity (r_data->refdef->camera_inverse); + mat4fidentity (refdef->camera); + mat4fidentity (refdef->camera_inverse); } + // FIXME pre-rotate the camera 90 degrees about the z axis such that the // camera forward vector (camera Y) points along the world +X axis and the // camera right vector (camera X) points along the world -Y axis. This @@ -174,10 +177,15 @@ SCR_UpdateScreen (transform_t *camera, double realtime, SCR_Func *scr_funcs) // AngleQuat for compatibility) treating X as forward and Y as left (or -Y // as right). Fixing this would take an audit of the usage of both, but is // probably worthwhile in the long run. - r_data->refdef->frame.mat[0] = -r_data->refdef->camera[1]; - r_data->refdef->frame.mat[1] = r_data->refdef->camera[0]; - r_data->refdef->frame.mat[2] = r_data->refdef->camera[2]; - r_data->refdef->frame.mat[3] = r_data->refdef->camera[3]; + refdef->frame.mat[0] = -refdef->camera[1]; + refdef->frame.mat[1] = refdef->camera[0]; + refdef->frame.mat[2] = refdef->camera[2]; + refdef->frame.mat[3] = refdef->camera[3]; + + //FIXME breaks fisheye as it calls the view render many times + EntQueue_Clear (r_ent_queue); + r_framecount++; + R_SetFrustum (); r_data->realtime = realtime; scr_copytop = r_data->scr_copyeverything = 0; @@ -186,6 +194,13 @@ SCR_UpdateScreen (transform_t *camera, double realtime, SCR_Func *scr_funcs) SCR_CalcRefdef (); } + R_AnimateLight (); + refdef->viewleaf = 0; + if (refdef->worldmodel) { + vec4f_t position = refdef->frame.position; + refdef->viewleaf = Mod_PointInLeaf (&position[0], refdef->worldmodel); + } + r_funcs->begin_frame (); r_funcs->render_view (); r_funcs->set_2d (0); diff --git a/libs/video/renderer/sw/sw_rmisc.c b/libs/video/renderer/sw/sw_rmisc.c index 91728168b..f7d41734f 100644 --- a/libs/video/renderer/sw/sw_rmisc.c +++ b/libs/video/renderer/sw/sw_rmisc.c @@ -176,23 +176,14 @@ R_SetupFrame (void) vrect_t vrect; float w, h; - R_AnimateLight (); - EntQueue_Clear (r_ent_queue); - r_framecount++; - numbtofpolys = 0; // build the transformation matrix for the given view angles VectorCopy (r_refdef.frame.position, modelorg); - vec4f_t position = r_refdef.frame.position; VectorCopy (r_refdef.frame.right, vright); VectorCopy (r_refdef.frame.forward, vfwd); VectorCopy (r_refdef.frame.up, vup); - R_SetFrustum (); - - // current viewleaf - r_refdef.viewleaf = Mod_PointInLeaf (&position[0], r_refdef.worldmodel); r_dowarpold = r_dowarp; r_dowarp = r_waterwarp->int_val && (r_refdef.viewleaf->contents <= diff --git a/libs/video/renderer/vulkan/vulkan_main.c b/libs/video/renderer/vulkan/vulkan_main.c index fe5ee3c29..bf26856dc 100644 --- a/libs/video/renderer/vulkan/vulkan_main.c +++ b/libs/video/renderer/vulkan/vulkan_main.c @@ -63,19 +63,6 @@ #include "r_internal.h" #include "vid_vulkan.h" -static void -setup_frame (vulkan_ctx_t *ctx) -{ - R_AnimateLight (); - EntQueue_Clear (r_ent_queue); - r_framecount++; - - R_SetFrustum (); - - vec4f_t position = r_refdef.frame.position; - r_refdef.viewleaf = Mod_PointInLeaf (&position[0], r_refdef.worldmodel); -} - static void Vulkan_RenderEntities (qfv_renderframe_t *rFrame) { @@ -137,7 +124,6 @@ Vulkan_RenderView (qfv_renderframe_t *rFrame) if (speeds) t[0] = Sys_DoubleTime (); - setup_frame (ctx); if (speeds) t[1] = Sys_DoubleTime (); R_MarkLeaves ();