[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.
This commit is contained in:
Bill Currie 2022-03-17 12:00:43 +09:00
parent 335d387ba8
commit 7ee9159638
5 changed files with 23 additions and 61 deletions

View file

@ -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 ();

View file

@ -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 ();

View file

@ -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);

View file

@ -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 <=

View file

@ -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 ();