From 80e1844d6cacaf2dbc2f931587c53a4efcdf91bd Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 12 Jan 2017 16:21:46 +0100 Subject: [PATCH] Split r_main into r_viewport, r_scene and r_light --- src/CMakeLists.txt | 4 +- src/gl/system/gl_swframebuffer.cpp | 3 +- src/gl/system/gl_swwipe.cpp | 1 - src/polyrenderer/drawers/poly_draw_args.cpp | 2 +- src/polyrenderer/drawers/poly_triangle.cpp | 1 - src/polyrenderer/drawers/screen_triangle.cpp | 1 - src/polyrenderer/math/tri_matrix.cpp | 3 +- src/polyrenderer/poly_renderer.cpp | 2 + src/polyrenderer/poly_renderer.h | 1 - src/polyrenderer/scene/poly_decal.cpp | 2 + src/polyrenderer/scene/poly_particle.cpp | 1 + src/polyrenderer/scene/poly_plane.cpp | 1 + src/polyrenderer/scene/poly_playersprite.cpp | 3 + src/polyrenderer/scene/poly_portal.cpp | 1 + src/polyrenderer/scene/poly_scene.h | 1 - src/polyrenderer/scene/poly_sky.cpp | 1 + src/polyrenderer/scene/poly_sprite.cpp | 1 + src/polyrenderer/scene/poly_wall.cpp | 1 + src/r_state.h | 1 - src/r_utility.h | 5 + src/swrenderer/drawers/r_draw.cpp | 2 +- src/swrenderer/drawers/r_draw_pal.cpp | 3 +- src/swrenderer/drawers/r_draw_rgba.cpp | 3 +- src/swrenderer/drawers/r_thread.cpp | 1 - src/swrenderer/line/r_fogboundary.cpp | 2 +- src/swrenderer/line/r_line.cpp | 5 +- src/swrenderer/line/r_line.h | 8 + src/swrenderer/line/r_walldraw.cpp | 4 +- src/swrenderer/line/r_walldraw.h | 1 + src/swrenderer/line/r_wallsetup.cpp | 4 +- src/swrenderer/plane/r_flatplane.cpp | 4 +- src/swrenderer/plane/r_skyplane.cpp | 4 +- src/swrenderer/plane/r_slopeplane.cpp | 4 +- src/swrenderer/plane/r_visibleplane.cpp | 2 +- src/swrenderer/plane/r_visibleplanelist.cpp | 4 +- src/swrenderer/r_main.cpp | 751 ------------------ src/swrenderer/r_main.h | 141 ---- src/swrenderer/r_memory.cpp | 1 - src/swrenderer/r_swrenderer.cpp | 17 +- src/swrenderer/scene/r_3dfloors.cpp | 2 +- src/swrenderer/scene/r_light.cpp | 178 +++++ src/swrenderer/scene/r_light.h | 73 ++ src/swrenderer/scene/r_opaque_pass.cpp | 4 +- src/swrenderer/scene/r_portal.cpp | 4 +- src/swrenderer/scene/r_scene.cpp | 270 +++++++ src/swrenderer/scene/r_scene.h | 34 + src/swrenderer/scene/r_translucent_pass.cpp | 3 +- src/swrenderer/scene/r_viewport.cpp | 195 +++++ src/swrenderer/scene/r_viewport.h | 41 + src/swrenderer/segments/r_clipsegment.cpp | 1 - src/swrenderer/segments/r_drawsegment.cpp | 3 +- src/swrenderer/segments/r_portalsegment.cpp | 1 - src/swrenderer/things/r_decal.cpp | 4 +- src/swrenderer/things/r_particle.cpp | 3 +- src/swrenderer/things/r_playersprite.cpp | 4 +- src/swrenderer/things/r_playersprite.h | 2 + src/swrenderer/things/r_sprite.cpp | 4 +- src/swrenderer/things/r_visiblesprite.cpp | 1 - src/swrenderer/things/r_visiblespritelist.cpp | 1 - src/swrenderer/things/r_voxel.cpp | 4 +- src/swrenderer/things/r_wallsprite.cpp | 4 +- src/v_draw.cpp | 3 +- src/win32/fb_d3d9.cpp | 2 +- 63 files changed, 893 insertions(+), 945 deletions(-) delete mode 100644 src/swrenderer/r_main.cpp delete mode 100644 src/swrenderer/r_main.h create mode 100644 src/swrenderer/scene/r_light.cpp create mode 100644 src/swrenderer/scene/r_light.h create mode 100644 src/swrenderer/scene/r_scene.cpp create mode 100644 src/swrenderer/scene/r_scene.h create mode 100644 src/swrenderer/scene/r_viewport.cpp create mode 100644 src/swrenderer/scene/r_viewport.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 44c72406f..3baba1c4b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -838,7 +838,6 @@ set( NOT_COMPILED_SOURCE_FILES set( FASTMATH_PCH_SOURCES swrenderer/r_swrenderer.cpp - swrenderer/r_main.cpp swrenderer/r_memory.cpp swrenderer/drawers/r_draw.cpp swrenderer/drawers/r_draw_pal.cpp @@ -846,9 +845,12 @@ set( FASTMATH_PCH_SOURCES swrenderer/drawers/r_drawers.cpp swrenderer/drawers/r_thread.cpp swrenderer/scene/r_3dfloors.cpp + swrenderer/scene/r_light.cpp swrenderer/scene/r_opaque_pass.cpp swrenderer/scene/r_portal.cpp + swrenderer/scene/r_scene.cpp swrenderer/scene/r_translucent_pass.cpp + swrenderer/scene/r_viewport.cpp swrenderer/line/r_line.cpp swrenderer/line/r_walldraw.cpp swrenderer/line/r_wallsetup.cpp diff --git a/src/gl/system/gl_swframebuffer.cpp b/src/gl/system/gl_swframebuffer.cpp index 0d9cdfce9..1ad965c6a 100644 --- a/src/gl/system/gl_swframebuffer.cpp +++ b/src/gl/system/gl_swframebuffer.cpp @@ -57,7 +57,6 @@ #include "v_pfx.h" #include "stats.h" #include "doomerrors.h" -#include "swrenderer/r_main.h" #include "r_data/r_translate.h" #include "f_wipe.h" #include "sbar.h" @@ -72,6 +71,8 @@ #include "gl/gl_functions.h" #include "gl_debug.h" +#include "swrenderer/scene/r_light.h" + CVAR(Int, gl_showpacks, 0, 0) #ifndef WIN32 // Defined in fb_d3d9 for Windows CVAR(Bool, vid_hwaalines, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) diff --git a/src/gl/system/gl_swwipe.cpp b/src/gl/system/gl_swwipe.cpp index 2f51ae5a4..7f8e44a66 100644 --- a/src/gl/system/gl_swwipe.cpp +++ b/src/gl/system/gl_swwipe.cpp @@ -53,7 +53,6 @@ #include "v_pfx.h" #include "stats.h" #include "doomerrors.h" -#include "swrenderer/r_main.h" #include "r_data/r_translate.h" #include "f_wipe.h" #include "sbar.h" diff --git a/src/polyrenderer/drawers/poly_draw_args.cpp b/src/polyrenderer/drawers/poly_draw_args.cpp index 60621553a..9e9686e92 100644 --- a/src/polyrenderer/drawers/poly_draw_args.cpp +++ b/src/polyrenderer/drawers/poly_draw_args.cpp @@ -34,7 +34,7 @@ #include "v_palette.h" #include "r_data/colormaps.h" #include "poly_draw_args.h" -#include "swrenderer/r_main.h" +#include "swrenderer/scene/r_viewport.h" void PolyDrawArgs::SetClipPlane(float a, float b, float c, float d) { diff --git a/src/polyrenderer/drawers/poly_triangle.cpp b/src/polyrenderer/drawers/poly_triangle.cpp index 5856b0267..a28945715 100644 --- a/src/polyrenderer/drawers/poly_triangle.cpp +++ b/src/polyrenderer/drawers/poly_triangle.cpp @@ -35,7 +35,6 @@ #include "r_data/colormaps.h" #include "poly_triangle.h" #include "swrenderer/drawers/r_draw_rgba.h" -#include "swrenderer/r_main.h" #include "screen_triangle.h" CVAR(Bool, r_debug_trisetup, false, 0); diff --git a/src/polyrenderer/drawers/screen_triangle.cpp b/src/polyrenderer/drawers/screen_triangle.cpp index e164b6fe0..d1858d511 100644 --- a/src/polyrenderer/drawers/screen_triangle.cpp +++ b/src/polyrenderer/drawers/screen_triangle.cpp @@ -35,7 +35,6 @@ #include "r_data/colormaps.h" #include "poly_triangle.h" #include "swrenderer/drawers/r_draw_rgba.h" -#include "swrenderer/r_main.h" #include "screen_triangle.h" void ScreenTriangle::SetupNormal(const TriDrawTriangleArgs *args, WorkerThreadData *thread) diff --git a/src/polyrenderer/math/tri_matrix.cpp b/src/polyrenderer/math/tri_matrix.cpp index 72be0d0ed..1f26ef2ef 100644 --- a/src/polyrenderer/math/tri_matrix.cpp +++ b/src/polyrenderer/math/tri_matrix.cpp @@ -33,10 +33,11 @@ #include "r_data/r_translate.h" #include "v_palette.h" #include "r_data/colormaps.h" +#include "r_utility.h" #include "tri_matrix.h" #include "polyrenderer/drawers/poly_triangle.h" #include "swrenderer/drawers/r_draw_rgba.h" -#include "swrenderer/r_main.h" +#include "swrenderer/scene/r_viewport.h" TriMatrix TriMatrix::null() { diff --git a/src/polyrenderer/poly_renderer.cpp b/src/polyrenderer/poly_renderer.cpp index 031dff683..22d996e9f 100644 --- a/src/polyrenderer/poly_renderer.cpp +++ b/src/polyrenderer/poly_renderer.cpp @@ -30,6 +30,8 @@ #include "gl/data/gl_data.h" #include "d_net.h" #include "po_man.h" +#include "swrenderer/scene/r_scene.h" +#include "swrenderer/scene/r_viewport.h" EXTERN_CVAR(Int, screenblocks) void InitGLRMapinfoData(); diff --git a/src/polyrenderer/poly_renderer.h b/src/polyrenderer/poly_renderer.h index c7de1b1cc..368872d97 100644 --- a/src/polyrenderer/poly_renderer.h +++ b/src/polyrenderer/poly_renderer.h @@ -28,7 +28,6 @@ #include #include "doomdata.h" #include "r_utility.h" -#include "swrenderer/r_main.h" #include "scene/poly_portal.h" #include "scene/poly_playersprite.h" #include "scene/poly_sky.h" diff --git a/src/polyrenderer/scene/poly_decal.cpp b/src/polyrenderer/scene/poly_decal.cpp index fbc95a15c..c36b67f4a 100644 --- a/src/polyrenderer/scene/poly_decal.cpp +++ b/src/polyrenderer/scene/poly_decal.cpp @@ -28,6 +28,8 @@ #include "poly_decal.h" #include "polyrenderer/poly_renderer.h" #include "a_sharedglobal.h" +#include "swrenderer/scene/r_scene.h" +#include "swrenderer/scene/r_light.h" void RenderPolyDecal::RenderWallDecals(const TriMatrix &worldToClip, const Vec4f &clipPlane, const seg_t *line, uint32_t subsectorDepth, uint32_t stencilValue) { diff --git a/src/polyrenderer/scene/poly_particle.cpp b/src/polyrenderer/scene/poly_particle.cpp index 275fd4640..e4380dae9 100644 --- a/src/polyrenderer/scene/poly_particle.cpp +++ b/src/polyrenderer/scene/poly_particle.cpp @@ -27,6 +27,7 @@ #include "r_data/r_translate.h" #include "poly_particle.h" #include "polyrenderer/poly_renderer.h" +#include "swrenderer/scene/r_light.h" void RenderPolyParticle::Render(const TriMatrix &worldToClip, const Vec4f &clipPlane, particle_t *particle, subsector_t *sub, uint32_t subsectorDepth, uint32_t stencilValue) { diff --git a/src/polyrenderer/scene/poly_plane.cpp b/src/polyrenderer/scene/poly_plane.cpp index 5a8396c61..908988104 100644 --- a/src/polyrenderer/scene/poly_plane.cpp +++ b/src/polyrenderer/scene/poly_plane.cpp @@ -29,6 +29,7 @@ #include "poly_portal.h" #include "polyrenderer/poly_renderer.h" #include "r_sky.h" +#include "swrenderer/scene/r_light.h" EXTERN_CVAR(Int, r_3dfloors) diff --git a/src/polyrenderer/scene/poly_playersprite.cpp b/src/polyrenderer/scene/poly_playersprite.cpp index 03e22f1d1..a3b29fa30 100644 --- a/src/polyrenderer/scene/poly_playersprite.cpp +++ b/src/polyrenderer/scene/poly_playersprite.cpp @@ -27,6 +27,9 @@ #include "r_data/r_translate.h" #include "poly_playersprite.h" #include "polyrenderer/poly_renderer.h" +#include "d_player.h" +#include "swrenderer/scene/r_viewport.h" +#include "swrenderer/scene/r_light.h" EXTERN_CVAR(Bool, r_drawplayersprites) EXTERN_CVAR(Bool, r_deathcamera) diff --git a/src/polyrenderer/scene/poly_portal.cpp b/src/polyrenderer/scene/poly_portal.cpp index 58bb5b049..1aa43e9bc 100644 --- a/src/polyrenderer/scene/poly_portal.cpp +++ b/src/polyrenderer/scene/poly_portal.cpp @@ -28,6 +28,7 @@ #include "r_data/r_translate.h" #include "poly_portal.h" #include "polyrenderer/poly_renderer.h" +#include "swrenderer/scene/r_light.h" #include "gl/data/gl_data.h" extern bool r_showviewer; diff --git a/src/polyrenderer/scene/poly_scene.h b/src/polyrenderer/scene/poly_scene.h index fbc878fc7..ba6fd5eea 100644 --- a/src/polyrenderer/scene/poly_scene.h +++ b/src/polyrenderer/scene/poly_scene.h @@ -28,7 +28,6 @@ #include #include "doomdata.h" #include "r_utility.h" -#include "swrenderer/r_main.h" #include "polyrenderer/drawers/poly_triangle.h" #include "polyrenderer/math/poly_intersection.h" #include "poly_wall.h" diff --git a/src/polyrenderer/scene/poly_sky.cpp b/src/polyrenderer/scene/poly_sky.cpp index 82be3f2bc..41bca43ff 100644 --- a/src/polyrenderer/scene/poly_sky.cpp +++ b/src/polyrenderer/scene/poly_sky.cpp @@ -28,6 +28,7 @@ #include "poly_portal.h" #include "r_sky.h" // for skyflatnum #include "g_levellocals.h" +#include "swrenderer/scene/r_light.h" PolySkyDome::PolySkyDome() { diff --git a/src/polyrenderer/scene/poly_sprite.cpp b/src/polyrenderer/scene/poly_sprite.cpp index d344ae78b..ce0547f62 100644 --- a/src/polyrenderer/scene/poly_sprite.cpp +++ b/src/polyrenderer/scene/poly_sprite.cpp @@ -28,6 +28,7 @@ #include "poly_sprite.h" #include "polyrenderer/poly_renderer.h" #include "polyrenderer/math/poly_intersection.h" +#include "swrenderer/scene/r_light.h" EXTERN_CVAR(Float, transsouls) EXTERN_CVAR(Int, r_drawfuzz) diff --git a/src/polyrenderer/scene/poly_wall.cpp b/src/polyrenderer/scene/poly_wall.cpp index 5c912dec0..1bf7cf24b 100644 --- a/src/polyrenderer/scene/poly_wall.cpp +++ b/src/polyrenderer/scene/poly_wall.cpp @@ -32,6 +32,7 @@ #include "poly_decal.h" #include "polyrenderer/poly_renderer.h" #include "r_sky.h" +#include "swrenderer/scene/r_light.h" EXTERN_CVAR(Bool, r_drawmirrors) diff --git a/src/r_state.h b/src/r_state.h index 7151c0441..9cd8400b4 100644 --- a/src/r_state.h +++ b/src/r_state.h @@ -68,7 +68,6 @@ extern int numgamesubsectors; extern AActor* camera; // [RH] camera instead of viewplayer extern sector_t* viewsector; // [RH] keep track of sector viewing from -namespace swrenderer { extern angle_t xtoviewangle[MAXWIDTH+1]; } extern DAngle FieldOfView; int R_FindSkin (const char *name, int pclass); // [RH] Find a skin diff --git a/src/r_utility.h b/src/r_utility.h index cb7bd50e2..488d45672 100644 --- a/src/r_utility.h +++ b/src/r_utility.h @@ -21,6 +21,11 @@ extern DAngle ViewPitch; extern DAngle ViewRoll; extern DVector3 ViewPath[2]; +extern double ViewCos; +extern double ViewSin; +extern int viewwindowx; +extern int viewwindowy; + extern "C" int centerx, centerxwide; extern "C" int centery; diff --git a/src/swrenderer/drawers/r_draw.cpp b/src/swrenderer/drawers/r_draw.cpp index a7d40e63c..b9a4a3ef0 100644 --- a/src/swrenderer/drawers/r_draw.cpp +++ b/src/swrenderer/drawers/r_draw.cpp @@ -50,7 +50,7 @@ #include "r_draw_rgba.h" #include "r_draw_pal.h" #include "r_thread.h" -#include "swrenderer/r_main.h" +#include "swrenderer/scene/r_light.h" CVAR(Bool, r_dynlights, 1, CVAR_ARCHIVE | CVAR_GLOBALCONFIG); diff --git a/src/swrenderer/drawers/r_draw_pal.cpp b/src/swrenderer/drawers/r_draw_pal.cpp index 13f6219ac..18dd88adb 100644 --- a/src/swrenderer/drawers/r_draw_pal.cpp +++ b/src/swrenderer/drawers/r_draw_pal.cpp @@ -45,9 +45,10 @@ #include "doomdef.h" #include "r_defs.h" #include "r_draw.h" -#include "swrenderer/r_main.h" #include "v_video.h" #include "r_draw_pal.h" +#include "swrenderer/scene/r_viewport.h" +#include "swrenderer/scene/r_light.h" // [SP] r_blendmethod - false = rgb555 matching (ZDoom classic), true = rgb666 (refactored) CVAR(Bool, r_blendmethod, false, CVAR_GLOBALCONFIG | CVAR_ARCHIVE) diff --git a/src/swrenderer/drawers/r_draw_rgba.cpp b/src/swrenderer/drawers/r_draw_rgba.cpp index 309a3e2bd..352a1538b 100644 --- a/src/swrenderer/drawers/r_draw_rgba.cpp +++ b/src/swrenderer/drawers/r_draw_rgba.cpp @@ -27,7 +27,6 @@ #include "doomdef.h" #include "i_system.h" #include "w_wad.h" -#include "swrenderer/r_main.h" #include "v_video.h" #include "doomstat.h" #include "st_stuff.h" @@ -39,6 +38,8 @@ #include "r_draw_rgba.h" #include "r_drawers.h" #include "gl/data/gl_matrix.h" +#include "swrenderer/scene/r_viewport.h" +#include "swrenderer/scene/r_light.h" #include "gi.h" #include "stats.h" diff --git a/src/swrenderer/drawers/r_thread.cpp b/src/swrenderer/drawers/r_thread.cpp index d629a23f2..c35d59777 100644 --- a/src/swrenderer/drawers/r_thread.cpp +++ b/src/swrenderer/drawers/r_thread.cpp @@ -25,7 +25,6 @@ #include "doomdef.h" #include "i_system.h" #include "w_wad.h" -#include "swrenderer/r_main.h" #include "v_video.h" #include "doomstat.h" #include "st_stuff.h" diff --git a/src/swrenderer/line/r_fogboundary.cpp b/src/swrenderer/line/r_fogboundary.cpp index ca1822a2c..523ce4b08 100644 --- a/src/swrenderer/line/r_fogboundary.cpp +++ b/src/swrenderer/line/r_fogboundary.cpp @@ -18,7 +18,6 @@ #include "w_wad.h" #include "doomdef.h" #include "doomstat.h" -#include "swrenderer/r_main.h" #include "r_sky.h" #include "stats.h" #include "v_video.h" @@ -38,6 +37,7 @@ #include "swrenderer/segments/r_drawsegment.h" #include "swrenderer/line/r_fogboundary.h" #include "swrenderer/r_memory.h" +#include "swrenderer/scene/r_light.h" #ifdef _MSC_VER #pragma warning(disable:4244) diff --git a/src/swrenderer/line/r_line.cpp b/src/swrenderer/line/r_line.cpp index 4122623b3..5679b8e50 100644 --- a/src/swrenderer/line/r_line.cpp +++ b/src/swrenderer/line/r_line.cpp @@ -30,12 +30,15 @@ #include "g_level.h" #include "r_wallsetup.h" #include "v_palette.h" +#include "r_utility.h" #include "r_data/colormaps.h" -#include "swrenderer/r_main.h" #include "swrenderer/r_memory.h" #include "swrenderer/scene/r_opaque_pass.h" #include "swrenderer/scene/r_3dfloors.h" #include "swrenderer/scene/r_portal.h" +#include "swrenderer/scene/r_viewport.h" +#include "swrenderer/scene/r_light.h" +#include "swrenderer/scene/r_scene.h" #include "swrenderer/line/r_line.h" #include "swrenderer/line/r_walldraw.h" #include "swrenderer/line/r_wallsetup.h" diff --git a/src/swrenderer/line/r_line.h b/src/swrenderer/line/r_line.h index 18d46e8b4..ae758ccab 100644 --- a/src/swrenderer/line/r_line.h +++ b/src/swrenderer/line/r_line.h @@ -13,6 +13,14 @@ #pragma once +#include "vectors.h" + +struct seg_t; +struct subsector_t; +struct sector_t; +struct side_t; +struct line_t; + namespace swrenderer { struct visplane_t; diff --git a/src/swrenderer/line/r_walldraw.cpp b/src/swrenderer/line/r_walldraw.cpp index f0320383a..c5e1e036a 100644 --- a/src/swrenderer/line/r_walldraw.cpp +++ b/src/swrenderer/line/r_walldraw.cpp @@ -27,7 +27,6 @@ #include "doomstat.h" #include "doomdata.h" -#include "swrenderer/r_main.h" #include "r_sky.h" #include "v_video.h" @@ -45,6 +44,9 @@ #include "swrenderer/scene/r_opaque_pass.h" #include "swrenderer/scene/r_3dfloors.h" #include "swrenderer/scene/r_portal.h" +#include "swrenderer/scene/r_scene.h" +#include "swrenderer/scene/r_viewport.h" +#include "swrenderer/scene/r_light.h" #include "swrenderer/line/r_walldraw.h" #include "swrenderer/line/r_wallsetup.h" diff --git a/src/swrenderer/line/r_walldraw.h b/src/swrenderer/line/r_walldraw.h index 8ef23438f..d3fad4ea8 100644 --- a/src/swrenderer/line/r_walldraw.h +++ b/src/swrenderer/line/r_walldraw.h @@ -15,6 +15,7 @@ class FTexture; struct FLightNode; +struct seg_t; namespace swrenderer { diff --git a/src/swrenderer/line/r_wallsetup.cpp b/src/swrenderer/line/r_wallsetup.cpp index ee32c1bd0..e7a86700d 100644 --- a/src/swrenderer/line/r_wallsetup.cpp +++ b/src/swrenderer/line/r_wallsetup.cpp @@ -19,9 +19,11 @@ #include "v_palette.h" #include "r_data/colormaps.h" #include "r_walldraw.h" -#include "swrenderer/r_main.h" #include "swrenderer/r_memory.h" #include "swrenderer/line/r_line.h" +#include "swrenderer/scene/r_scene.h" +#include "swrenderer/scene/r_viewport.h" +#include "swrenderer/scene/r_light.h" namespace swrenderer { diff --git a/src/swrenderer/plane/r_flatplane.cpp b/src/swrenderer/plane/r_flatplane.cpp index 760ae1b22..9a9494833 100644 --- a/src/swrenderer/plane/r_flatplane.cpp +++ b/src/swrenderer/plane/r_flatplane.cpp @@ -18,7 +18,6 @@ #include "w_wad.h" #include "doomdef.h" #include "doomstat.h" -#include "swrenderer/r_main.h" #include "r_sky.h" #include "stats.h" #include "v_video.h" @@ -37,6 +36,9 @@ #include "swrenderer/segments/r_clipsegment.h" #include "swrenderer/segments/r_drawsegment.h" #include "swrenderer/scene/r_portal.h" +#include "swrenderer/scene/r_scene.h" +#include "swrenderer/scene/r_viewport.h" +#include "swrenderer/scene/r_light.h" #include "swrenderer/plane/r_visibleplane.h" #include "swrenderer/r_memory.h" diff --git a/src/swrenderer/plane/r_skyplane.cpp b/src/swrenderer/plane/r_skyplane.cpp index 9909f868e..ab8dedb97 100644 --- a/src/swrenderer/plane/r_skyplane.cpp +++ b/src/swrenderer/plane/r_skyplane.cpp @@ -18,7 +18,6 @@ #include "w_wad.h" #include "doomdef.h" #include "doomstat.h" -#include "swrenderer/r_main.h" #include "r_sky.h" #include "stats.h" #include "v_video.h" @@ -39,6 +38,9 @@ #include "swrenderer/line/r_wallsetup.h" #include "swrenderer/line/r_walldraw.h" #include "swrenderer/scene/r_portal.h" +#include "swrenderer/scene/r_scene.h" +#include "swrenderer/scene/r_viewport.h" +#include "swrenderer/scene/r_light.h" #include "swrenderer/r_memory.h" #include "g_levellocals.h" diff --git a/src/swrenderer/plane/r_slopeplane.cpp b/src/swrenderer/plane/r_slopeplane.cpp index 6317928a7..b2d42e198 100644 --- a/src/swrenderer/plane/r_slopeplane.cpp +++ b/src/swrenderer/plane/r_slopeplane.cpp @@ -18,7 +18,6 @@ #include "w_wad.h" #include "doomdef.h" #include "doomstat.h" -#include "swrenderer/r_main.h" #include "r_sky.h" #include "stats.h" #include "v_video.h" @@ -37,6 +36,9 @@ #include "swrenderer/segments/r_clipsegment.h" #include "swrenderer/segments/r_drawsegment.h" #include "swrenderer/scene/r_portal.h" +#include "swrenderer/scene/r_scene.h" +#include "swrenderer/scene/r_viewport.h" +#include "swrenderer/scene/r_light.h" #include "swrenderer/r_memory.h" #include "swrenderer/plane/r_visibleplane.h" diff --git a/src/swrenderer/plane/r_visibleplane.cpp b/src/swrenderer/plane/r_visibleplane.cpp index 2fa0fc44d..6731262f7 100644 --- a/src/swrenderer/plane/r_visibleplane.cpp +++ b/src/swrenderer/plane/r_visibleplane.cpp @@ -28,11 +28,11 @@ #include "d_net.h" #include "g_level.h" #include "gl/dynlights/gl_dynlight.h" -#include "swrenderer/r_main.h" #include "swrenderer/r_memory.h" #include "swrenderer/scene/r_opaque_pass.h" #include "swrenderer/scene/r_3dfloors.h" #include "swrenderer/scene/r_portal.h" +#include "swrenderer/scene/r_light.h" #include "swrenderer/plane/r_flatplane.h" #include "swrenderer/plane/r_slopeplane.h" #include "swrenderer/plane/r_skyplane.h" diff --git a/src/swrenderer/plane/r_visibleplanelist.cpp b/src/swrenderer/plane/r_visibleplanelist.cpp index 299f2f862..760b85560 100644 --- a/src/swrenderer/plane/r_visibleplanelist.cpp +++ b/src/swrenderer/plane/r_visibleplanelist.cpp @@ -28,11 +28,13 @@ #include "d_net.h" #include "g_level.h" #include "gl/dynlights/gl_dynlight.h" -#include "swrenderer/r_main.h" #include "swrenderer/r_memory.h" #include "swrenderer/scene/r_opaque_pass.h" #include "swrenderer/scene/r_3dfloors.h" #include "swrenderer/scene/r_portal.h" +#include "swrenderer/scene/r_scene.h" +#include "swrenderer/scene/r_viewport.h" +#include "swrenderer/scene/r_light.h" #include "swrenderer/plane/r_flatplane.h" #include "swrenderer/plane/r_slopeplane.h" #include "swrenderer/plane/r_skyplane.h" diff --git a/src/swrenderer/r_main.cpp b/src/swrenderer/r_main.cpp deleted file mode 100644 index f07b26162..000000000 --- a/src/swrenderer/r_main.cpp +++ /dev/null @@ -1,751 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// $Id:$ -// -// Copyright (C) 1993-1996 by id Software, Inc. -// -// This source is available for distribution and/or modification -// only under the terms of the DOOM Source Code License as -// published by id Software. All rights reserved. -// -// The source is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License -// for more details. -// -// $Log:$ -// -// DESCRIPTION: -// Rendering main loop and setup functions, -// utility functions (BSP, geometry, trigonometry). -// See tables.c, too. -// -//----------------------------------------------------------------------------- - -// HEADER FILES ------------------------------------------------------------ - -#include -#include - -#include "templates.h" -#include "doomdef.h" -#include "d_net.h" -#include "doomstat.h" -#include "m_random.h" -#include "m_bbox.h" -#include "r_main.h" -#include "drawers/r_draw.h" -#include "plane/r_flatplane.h" -#include "scene/r_opaque_pass.h" -#include "segments/r_drawsegment.h" -#include "segments/r_portalsegment.h" -#include "segments/r_clipsegment.h" -#include "scene/r_3dfloors.h" -#include "scene/r_portal.h" -#include "scene/r_translucent_pass.h" -#include "r_sky.h" -#include "drawers/r_draw_rgba.h" -#include "st_stuff.h" -#include "c_cvars.h" -#include "c_dispatch.h" -#include "v_video.h" -#include "stats.h" -#include "i_video.h" -#include "i_system.h" -#include "a_sharedglobal.h" -#include "r_data/r_translate.h" -#include "p_3dmidtex.h" -#include "r_data/r_interpolate.h" -#include "v_palette.h" -#include "po_man.h" -#include "p_effect.h" -#include "st_start.h" -#include "v_font.h" -#include "r_data/colormaps.h" -#include "p_maputl.h" -#include "p_setup.h" -#include "version.h" -#include "c_console.h" -#include "r_memory.h" -#include "swrenderer/things/r_playersprite.h" -#include "swrenderer/plane/r_visibleplanelist.h" - -CVAR (String, r_viewsize, "", CVAR_NOSET) -CVAR (Bool, r_shadercolormaps, true, CVAR_ARCHIVE) - -EXTERN_CVAR(Bool, r_fullbrightignoresectorcolor) - -namespace swrenderer -{ - -// MACROS ------------------------------------------------------------------ - -#if 0 -#define TEST_X 32343794 -#define TEST_Y 111387517 -#define TEST_Z 2164524 -#define TEST_ANGLE 2468347904 -#endif - - -// TYPES ------------------------------------------------------------------- - -// EXTERNAL FUNCTION PROTOTYPES -------------------------------------------- - -void R_SpanInitData (); - -// PUBLIC FUNCTION PROTOTYPES ---------------------------------------------- - -// PRIVATE FUNCTION PROTOTYPES --------------------------------------------- - -static void R_ShutdownRenderer(); - -// EXTERNAL DATA DECLARATIONS ---------------------------------------------- - -extern int fuzzviewheight; - - -// PRIVATE DATA DECLARATIONS ----------------------------------------------- - -static double CurrentVisibility = 8.f; -static double MaxVisForWall; -static double MaxVisForFloor; -bool r_dontmaplines; - -// PUBLIC DATA DEFINITIONS ------------------------------------------------- - -bool r_swtruecolor; - -double r_BaseVisibility; -double r_WallVisibility; -double r_FloorVisibility; -float r_TiltVisibility; -double r_SpriteVisibility; -double r_ParticleVisibility; - -double GlobVis; -fixed_t viewingrangerecip; -double FocalLengthX; -double FocalLengthY; -FDynamicColormap*basecolormap; // [RH] colormap currently drawing with -int fixedlightlev; -FSWColormap *fixedcolormap; -FSpecialColormap *realfixedcolormap; -double WallTMapScale2; - - -bool bRenderingToCanvas; // [RH] True if rendering to a special canvas -double globaluclip, globaldclip; -double CenterX, CenterY; -double YaspectMul; -double BaseYaspectMul; // yaspectmul without a forced aspect ratio -double IYaspectMul; -double InvZtoScale; - -// just for profiling purposes -int linecount; -int loopcount; - - -// -// precalculated math tables -// - -// The xtoviewangleangle[] table maps a screen pixel -// to the lowest viewangle that maps back to x ranges -// from clipangle to -clipangle. -angle_t xtoviewangle[MAXWIDTH+1]; - -bool foggy; // [RH] ignore extralight and fullbright? -int r_actualextralight; - -cycle_t WallCycles, PlaneCycles, MaskedCycles, WallScanCycles; - -// PRIVATE DATA DEFINITIONS ------------------------------------------------ - -static int lastcenteryfrac; - -// CODE -------------------------------------------------------------------- - -//========================================================================== -// -// R_InitTextureMapping -// -//========================================================================== - -void R_InitTextureMapping () -{ - int i; - - // Calc focallength so FieldOfView angles cover viewwidth. - FocalLengthX = CenterX / FocalTangent; - FocalLengthY = FocalLengthX * YaspectMul; - - // This is 1/FocalTangent before the widescreen extension of FOV. - viewingrangerecip = FLOAT2FIXED(1. / tan(FieldOfView.Radians() / 2)); - - - // Now generate xtoviewangle for sky texture mapping. - // [RH] Do not generate viewangletox, because texture mapping is no - // longer done with trig, so it's not needed. - const double slopestep = FocalTangent / centerx; - double slope; - - for (i = centerx, slope = 0; i <= viewwidth; i++, slope += slopestep) - { - xtoviewangle[i] = angle_t((2 * M_PI - atan(slope)) * (ANGLE_180 / M_PI)); - } - for (i = 0; i < centerx; i++) - { - xtoviewangle[i] = 0 - xtoviewangle[viewwidth - i - 1]; - } -} - -//========================================================================== -// -// R_SetVisibility -// -// Changes how rapidly things get dark with distance -// -//========================================================================== - -void R_SetVisibility(double vis) -{ - // Allow negative visibilities, just for novelty's sake - vis = clamp(vis, -204.7, 204.7); // (205 and larger do not work in 5:4 aspect ratio) - - CurrentVisibility = vis; - - if (FocalTangent == 0 || FocalLengthY == 0) - { // If r_visibility is called before the renderer is all set up, don't - // divide by zero. This will be called again later, and the proper - // values can be initialized then. - return; - } - - r_BaseVisibility = vis; - - // Prevent overflow on walls - if (r_BaseVisibility < 0 && r_BaseVisibility < -MaxVisForWall) - r_WallVisibility = -MaxVisForWall; - else if (r_BaseVisibility > 0 && r_BaseVisibility > MaxVisForWall) - r_WallVisibility = MaxVisForWall; - else - r_WallVisibility = r_BaseVisibility; - - r_WallVisibility = (InvZtoScale * SCREENWIDTH*AspectBaseHeight(WidescreenRatio) / - (viewwidth*SCREENHEIGHT*3)) * (r_WallVisibility * FocalTangent); - - // Prevent overflow on floors/ceilings. Note that the calculation of - // MaxVisForFloor means that planes less than two units from the player's - // view could still overflow, but there is no way to totally eliminate - // that while still using fixed point math. - if (r_BaseVisibility < 0 && r_BaseVisibility < -MaxVisForFloor) - r_FloorVisibility = -MaxVisForFloor; - else if (r_BaseVisibility > 0 && r_BaseVisibility > MaxVisForFloor) - r_FloorVisibility = MaxVisForFloor; - else - r_FloorVisibility = r_BaseVisibility; - - r_FloorVisibility = 160.0 * r_FloorVisibility / FocalLengthY; - - r_TiltVisibility = float(vis * FocalTangent * (16.f * 320.f) / viewwidth); - r_SpriteVisibility = r_WallVisibility; -} - -//========================================================================== -// -// R_GetVisibility -// -//========================================================================== - -double R_GetVisibility() -{ - return CurrentVisibility; -} - -//========================================================================== -// -// CCMD r_visibility -// -// Controls how quickly light ramps across a 1/z range. Set this, and it -// sets all the r_*Visibility variables (except r_SkyVisibilily, which is -// currently unused). -// -//========================================================================== - -CCMD (r_visibility) -{ - if (argv.argc() < 2) - { - Printf ("Visibility is %g\n", R_GetVisibility()); - } - else if (!netgame) - { - R_SetVisibility(atof(argv[1])); - } - else - { - Printf ("Visibility cannot be changed in net games.\n"); - } -} - -//========================================================================== -// -// R_SetWindow -// -//========================================================================== - -void R_SWRSetWindow(int windowSize, int fullWidth, int fullHeight, int stHeight, float trueratio) -{ - int virtheight, virtwidth, virtwidth2, virtheight2; - - if (!bRenderingToCanvas) - { // Set r_viewsize cvar to reflect the current view size - UCVarValue value; - char temp[16]; - - mysnprintf (temp, countof(temp), "%d x %d", viewwidth, viewheight); - value.String = temp; - r_viewsize.ForceSet (value, CVAR_String); - } - - fuzzviewheight = viewheight - 2; // Maximum row the fuzzer can draw to - - lastcenteryfrac = 1<<30; - CenterX = centerx; - CenterY = centery; - - virtwidth = virtwidth2 = fullWidth; - virtheight = virtheight2 = fullHeight; - - if (AspectTallerThanWide(trueratio)) - { - virtheight2 = virtheight2 * AspectMultiplier(trueratio) / 48; - } - else - { - virtwidth2 = virtwidth2 * AspectMultiplier(trueratio) / 48; - } - - if (AspectTallerThanWide(WidescreenRatio)) - { - virtheight = virtheight * AspectMultiplier(WidescreenRatio) / 48; - } - else - { - virtwidth = virtwidth * AspectMultiplier(WidescreenRatio) / 48; - } - - BaseYaspectMul = 320.0 * virtheight2 / (r_Yaspect * virtwidth2); - YaspectMul = 320.0 * virtheight / (r_Yaspect * virtwidth); - IYaspectMul = (double)virtwidth * r_Yaspect / 320.0 / virtheight; - InvZtoScale = YaspectMul * CenterX; - - WallTMapScale2 = IYaspectMul / CenterX; - - // psprite scales - RenderPlayerSprite::SetupSpriteScale(); - - // thing clipping - fillshort (screenheightarray, viewwidth, (short)viewheight); - - R_InitTextureMapping (); - - MaxVisForWall = (InvZtoScale * (SCREENWIDTH*r_Yaspect) / - (viewwidth*SCREENHEIGHT * FocalTangent)); - MaxVisForWall = 32767.0 / MaxVisForWall; - MaxVisForFloor = 32767.0 / (viewheight >> 2) * FocalLengthY / 160; - - // Reset r_*Visibility vars - R_SetVisibility(R_GetVisibility()); -} - -//========================================================================== -// -// R_Init -// -//========================================================================== - -void R_InitRenderer() -{ - atterm(R_ShutdownRenderer); - // viewwidth / viewheight are set by the defaults - fillshort (zeroarray, MAXWIDTH, 0); - - R_InitShadeMaps(); - R_InitColumnDrawers (); -} - -//========================================================================== -// -// R_ShutdownRenderer -// -//========================================================================== - -static void R_ShutdownRenderer() -{ - RenderTranslucentPass::Deinit(); - VisiblePlaneList::Instance()->Deinit(); - Clip3DFloors::Instance()->Cleanup(); - R_DeinitOpenings(); - R_FreeDrawSegs(); -} - -//========================================================================== -// -// R_SetupColormap -// -// Sets up special fixed colormaps -// -//========================================================================== - -void R_SetupColormap(player_t *player) -{ - realfixedcolormap = NULL; - fixedcolormap = NULL; - fixedlightlev = -1; - - if (player != NULL && camera == player->mo) - { - if (player->fixedcolormap >= 0 && player->fixedcolormap < (int)SpecialColormaps.Size()) - { - realfixedcolormap = &SpecialColormaps[player->fixedcolormap]; - if (RenderTarget == screen && (r_swtruecolor || ((DFrameBuffer *)screen->Accel2D && r_shadercolormaps))) - { - // Render everything fullbright. The copy to video memory will - // apply the special colormap, so it won't be restricted to the - // palette. - fixedcolormap = &realcolormaps; - } - else - { - fixedcolormap = &SpecialColormaps[player->fixedcolormap]; - } - } - else if (player->fixedlightlevel >= 0 && player->fixedlightlevel < NUMCOLORMAPS) - { - fixedlightlev = player->fixedlightlevel * 256; - // [SP] Emulate GZDoom's light-amp goggles. - if (r_fullbrightignoresectorcolor && fixedlightlev >= 0) - { - fixedcolormap = &FullNormalLight; - } - } - } - // [RH] Inverse light for shooting the Sigil - if (fixedcolormap == NULL && extralight == INT_MIN) - { - fixedcolormap = &SpecialColormaps[INVERSECOLORMAP]; - extralight = 0; - } -} - -//========================================================================== -// -// R_SetupFreelook -// -// [RH] freelook stuff -// -//========================================================================== - -void R_SetupFreelook() -{ - double dy; - - if (camera != NULL) - { - dy = FocalLengthY * (-ViewPitch).Tan(); - } - else - { - dy = 0; - } - - CenterY = (viewheight / 2.0) + dy; - centery = xs_ToInt(CenterY); - globaluclip = -CenterY / InvZtoScale; - globaldclip = (viewheight - CenterY) / InvZtoScale; - - RenderFlatPlane::SetupSlope(); -} - -//========================================================================== -// -// R_SetupBuffer -// -// Precalculate all row offsets and fuzz table. -// -//========================================================================== - -void R_SetupBuffer () -{ - using namespace drawerargs; - - static BYTE *lastbuff = NULL; - - int pitch = RenderTarget->GetPitch(); - int pixelsize = r_swtruecolor ? 4 : 1; - BYTE *lineptr = RenderTarget->GetBuffer() + (viewwindowy*pitch + viewwindowx) * pixelsize; - - if (dc_pitch != pitch || lineptr != lastbuff) - { - if (dc_pitch != pitch) - { - dc_pitch = pitch; - R_InitFuzzTable (pitch); - } - dc_destorg = lineptr; - dc_destheight = RenderTarget->GetHeight() - viewwindowy; - for (int i = 0; i < RenderTarget->GetHeight(); i++) - { - ylookup[i] = i * pitch; - } - } -} - -//========================================================================== -// -// R_RenderActorView -// -//========================================================================== - -void R_RenderActorView (AActor *actor, bool dontmaplines) -{ - WallCycles.Reset(); - PlaneCycles.Reset(); - MaskedCycles.Reset(); - WallScanCycles.Reset(); - - Clip3DFloors *clip3d = Clip3DFloors::Instance(); - clip3d->fakeActive = false; // kg3D - reset fake floor indicator - clip3d->ResetClip(); // reset clips (floor/ceiling) - - R_SetupBuffer (); - R_SetupFrame (actor); - - // Clear buffers. - R_ClearClipSegs (0, viewwidth); - R_ClearDrawSegs (); - VisiblePlaneList::Instance()->Clear(true); - R_FreePlaneLights(); - RenderTranslucentPass::Clear(); - - // opening / clipping determination - RenderOpaquePass::Instance()->ClearClip(); - R_FreeOpenings(); - - NetUpdate (); - - colfunc = basecolfunc; - spanfunc = &SWPixelFormatDrawers::DrawSpan; - - RenderPortal::Instance()->SetMainPortal(); - - r_dontmaplines = dontmaplines; - - // [RH] Hack to make windows into underwater areas possible - RenderOpaquePass::Instance()->ResetFakingUnderwater(); - - // [RH] Setup particles for this frame - P_FindParticleSubsectors (); - - WallCycles.Clock(); - ActorRenderFlags savedflags = camera->renderflags; - // Never draw the player unless in chasecam mode - if (!r_showviewer) - { - camera->renderflags |= RF_INVISIBLE; - } - // Link the polyobjects right before drawing the scene to reduce the amounts of calls to this function - PO_LinkToSubsectors(); - RenderOpaquePass::Instance()->RenderScene(); - Clip3DFloors::Instance()->ResetClip(); // reset clips (floor/ceiling) - camera->renderflags = savedflags; - WallCycles.Unclock(); - - NetUpdate (); - - if (viewactive) - { - PlaneCycles.Clock(); - VisiblePlaneList::Instance()->Render(); - RenderPortal::Instance()->RenderPlanePortals(); - PlaneCycles.Unclock(); - - RenderPortal::Instance()->RenderLinePortals(); - - NetUpdate (); - - MaskedCycles.Clock(); - RenderTranslucentPass::Render(); - MaskedCycles.Unclock(); - - NetUpdate (); - } - WallPortals.Clear (); - interpolator.RestoreInterpolations (); - R_SetupBuffer (); - - // If we don't want shadered colormaps, NULL it now so that the - // copy to the screen does not use a special colormap shader. - if (!r_shadercolormaps && !r_swtruecolor) - { - realfixedcolormap = NULL; - } -} - -//========================================================================== -// -// R_RenderViewToCanvas -// -// Pre: Canvas is already locked. -// -//========================================================================== - -void R_RenderViewToCanvas (AActor *actor, DCanvas *canvas, - int x, int y, int width, int height, bool dontmaplines) -{ - const bool savedviewactive = viewactive; - const bool savedoutputformat = r_swtruecolor; - - if (r_swtruecolor != canvas->IsBgra()) - { - r_swtruecolor = canvas->IsBgra(); - R_InitColumnDrawers(); - } - - R_BeginDrawerCommands(); - - viewwidth = width; - RenderTarget = canvas; - bRenderingToCanvas = true; - - R_SetWindow (12, width, height, height, true); - viewwindowx = x; - viewwindowy = y; - viewactive = true; - - R_RenderActorView (actor, dontmaplines); - - R_EndDrawerCommands(); - - RenderTarget = screen; - bRenderingToCanvas = false; - R_ExecuteSetViewSize (); - screen->Lock (true); - R_SetupBuffer (); - screen->Unlock (); - - viewactive = savedviewactive; - r_swtruecolor = savedoutputformat; - - if (r_swtruecolor != canvas->IsBgra()) - { - R_InitColumnDrawers(); - } -} - -//========================================================================== -// -// R_MultiresInit -// -// Called from V_SetResolution() -// -//========================================================================== - -void R_MultiresInit () -{ - VisiblePlaneList::Instance()->Init(); -} - - -//========================================================================== -// -// STAT fps -// -// Displays statistics about rendering times -// -//========================================================================== - -ADD_STAT (fps) -{ - FString out; - out.Format("frame=%04.1f ms walls=%04.1f ms planes=%04.1f ms masked=%04.1f ms", - FrameCycles.TimeMS(), WallCycles.TimeMS(), PlaneCycles.TimeMS(), MaskedCycles.TimeMS()); - return out; -} - - -static double f_acc, w_acc,p_acc,m_acc; -static int acc_c; - -ADD_STAT (fps_accumulated) -{ - f_acc += FrameCycles.TimeMS(); - w_acc += WallCycles.TimeMS(); - p_acc += PlaneCycles.TimeMS(); - m_acc += MaskedCycles.TimeMS(); - acc_c++; - FString out; - out.Format("frame=%04.1f ms walls=%04.1f ms planes=%04.1f ms masked=%04.1f ms %d counts", - f_acc/acc_c, w_acc/acc_c, p_acc/acc_c, m_acc/acc_c, acc_c); - Printf(PRINT_LOG, "%s\n", out.GetChars()); - return out; -} - -//========================================================================== -// -// STAT wallcycles -// -// Displays the minimum number of cycles spent drawing walls -// -//========================================================================== - -static double bestwallcycles = HUGE_VAL; - -ADD_STAT (wallcycles) -{ - FString out; - double cycles = WallCycles.Time(); - if (cycles && cycles < bestwallcycles) - bestwallcycles = cycles; - out.Format ("%g", bestwallcycles); - return out; -} - -//========================================================================== -// -// CCMD clearwallcycles -// -// Resets the count of minimum wall drawing cycles -// -//========================================================================== - -CCMD (clearwallcycles) -{ - bestwallcycles = HUGE_VAL; -} - -#if 0 -// The replacement code for Build's wallscan doesn't have any timing calls so this does not work anymore. -static double bestscancycles = HUGE_VAL; - -ADD_STAT (scancycles) -{ - FString out; - double scancycles = WallScanCycles.Time(); - if (scancycles && scancycles < bestscancycles) - bestscancycles = scancycles; - out.Format ("%g", bestscancycles); - return out; -} - -CCMD (clearscancycles) -{ - bestscancycles = HUGE_VAL; -} -#endif - -} diff --git a/src/swrenderer/r_main.h b/src/swrenderer/r_main.h deleted file mode 100644 index c0a8ac345..000000000 --- a/src/swrenderer/r_main.h +++ /dev/null @@ -1,141 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// $Id:$ -// -// Copyright (C) 1993-1996 by id Software, Inc. -// -// This source is available for distribution and/or modification -// only under the terms of the DOOM Source Code License as -// published by id Software. All rights reserved. -// -// The source is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License -// for more details. -// -// DESCRIPTION: -// System specific interface stuff. -// -//----------------------------------------------------------------------------- - - -#ifndef __R_MAIN_H__ -#define __R_MAIN_H__ - -#include "r_utility.h" -#include "d_player.h" -#include "v_palette.h" -#include "r_data/colormaps.h" - -extern double ViewCos; -extern double ViewSin; -extern int viewwindowx; -extern int viewwindowy; - -typedef BYTE lighttable_t; // This could be wider for >8 bit display. - -extern cycle_t FrameCycles; - -namespace swrenderer -{ - -extern cycle_t WallCycles, PlaneCycles, MaskedCycles, WallScanCycles; - -// -// POV related. -// -extern bool bRenderingToCanvas; -extern fixed_t viewingrangerecip; -extern double FocalLengthX, FocalLengthY; -extern double InvZtoScale; - -extern double WallTMapScale2; - - -extern double CenterX; -extern double CenterY; -extern double YaspectMul; -extern double IYaspectMul; - -extern FDynamicColormap*basecolormap; // [RH] Colormap for sector currently being drawn - -extern int linecount; -extern int loopcount; - -extern bool r_dontmaplines; - -// -// Lighting. -// -// [RH] This has changed significantly from Doom, which used lookup -// tables based on 1/z for walls and z for flats and only recognized -// 16 discrete light levels. The terminology I use is borrowed from Build. -// - -// The size of a single colormap, in bits -#define COLORMAPSHIFT 8 - -// Convert a light level into an unbounded colormap index (shade). Result is -// fixed point. Why the +12? I wish I knew, but experimentation indicates it -// is necessary in order to best reproduce Doom's original lighting. -#define LIGHT2SHADE(l) ((NUMCOLORMAPS*2*FRACUNIT)-(((l)+12)*(FRACUNIT*NUMCOLORMAPS/128))) - -// MAXLIGHTSCALE from original DOOM, divided by 2. -#define MAXLIGHTVIS (24.0) - -// Convert a shade and visibility to a clamped colormap index. -// Result is not fixed point. -// Change R_CalcTiltedLighting() when this changes. -#define GETPALOOKUP(vis,shade) (clamp (((shade)-FLOAT2FIXED(MIN(MAXLIGHTVIS,double(vis))))>>FRACBITS, 0, NUMCOLORMAPS-1)) - -// Calculate the light multiplier for dc_light/ds_light -// This is used instead of GETPALOOKUP when ds_colormap/dc_colormap is set to the base colormap -// Returns a value between 0 and 1 in fixed point -#define LIGHTSCALE(vis,shade) FLOAT2FIXED(clamp((FIXED2DBL(shade) - (MIN(MAXLIGHTVIS,double(vis)))) / NUMCOLORMAPS, 0.0, (NUMCOLORMAPS-1)/(double)NUMCOLORMAPS)) - -// Converts fixedlightlev into a shade value -#define FIXEDLIGHT2SHADE(lightlev) (((lightlev) >> COLORMAPSHIFT) << FRACBITS) - -extern bool r_swtruecolor; - -extern double GlobVis; - -void R_SetVisibility(double visibility); -double R_GetVisibility(); - -extern double r_BaseVisibility; -extern double r_WallVisibility; -extern double r_FloorVisibility; -extern float r_TiltVisibility; -extern double r_SpriteVisibility; - -extern int r_actualextralight; -extern bool foggy; -extern int fixedlightlev; -extern FSWColormap* fixedcolormap; -extern FSpecialColormap*realfixedcolormap; - -void R_InitTextureMapping (); - - -// -// REFRESH - the actual rendering functions. -// - -// Called by G_Drawer. -void R_RenderActorView (AActor *actor, bool dontmaplines = false); -void R_SetupBuffer (); - -void R_RenderViewToCanvas (AActor *actor, DCanvas *canvas, int x, int y, int width, int height, bool dontmaplines = false); - -// [RH] Initialize multires stuff for renderer -void R_MultiresInit (void); - - - -extern double globaluclip, globaldclip; - -} - -#endif // __R_MAIN_H__ diff --git a/src/swrenderer/r_memory.cpp b/src/swrenderer/r_memory.cpp index c77cada56..0893f6936 100644 --- a/src/swrenderer/r_memory.cpp +++ b/src/swrenderer/r_memory.cpp @@ -18,7 +18,6 @@ #include "i_system.h" #include "p_lnspec.h" #include "p_setup.h" -#include "swrenderer/r_main.h" #include "swrenderer/drawers/r_draw.h" #include "swrenderer/plane/r_visibleplane.h" #include "a_sharedglobal.h" diff --git a/src/swrenderer/r_swrenderer.cpp b/src/swrenderer/r_swrenderer.cpp index d11d6ee89..d1397f10b 100644 --- a/src/swrenderer/r_swrenderer.cpp +++ b/src/swrenderer/r_swrenderer.cpp @@ -32,9 +32,12 @@ ** */ - -#include "r_main.h" +#include "swrenderer/scene/r_scene.h" +#include "swrenderer/scene/r_viewport.h" #include "swrenderer/things/r_playersprite.h" +#include "swrenderer/scene/r_scene.h" +#include "swrenderer/scene/r_viewport.h" +#include "swrenderer/scene/r_light.h" #include "v_palette.h" #include "v_video.h" #include "m_png.h" @@ -69,16 +72,6 @@ CUSTOM_CVAR(Bool, r_polyrenderer, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOI } } -namespace swrenderer -{ - -void R_SWRSetWindow(int windowSize, int fullWidth, int fullHeight, int stHeight, float trueratio); -void R_SetupColormap(player_t *); -void R_SetupFreelook(); -void R_InitRenderer(); - -} - using namespace swrenderer; FSoftwareRenderer::FSoftwareRenderer() diff --git a/src/swrenderer/scene/r_3dfloors.cpp b/src/swrenderer/scene/r_3dfloors.cpp index 23b4adaba..3feb7b91c 100644 --- a/src/swrenderer/scene/r_3dfloors.cpp +++ b/src/swrenderer/scene/r_3dfloors.cpp @@ -9,10 +9,10 @@ #include "doomdef.h" #include "p_local.h" #include "c_dispatch.h" -#include "swrenderer/r_main.h" #include "r_opaque_pass.h" #include "c_cvars.h" #include "r_3dfloors.h" +#include "r_utility.h" CVAR(Int, r_3dfloors, true, 0); diff --git a/src/swrenderer/scene/r_light.cpp b/src/swrenderer/scene/r_light.cpp new file mode 100644 index 000000000..e5cfb3f4f --- /dev/null +++ b/src/swrenderer/scene/r_light.cpp @@ -0,0 +1,178 @@ +// +// Copyright (C) 1993-1996 by id Software, Inc. +// +// This source is available for distribution and/or modification +// only under the terms of the DOOM Source Code License as +// published by id Software. All rights reserved. +// +// The source is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License +// for more details. +// + +#include +#include + +#include "templates.h" +#include "i_system.h" +#include "w_wad.h" +#include "doomdef.h" +#include "doomstat.h" +#include "r_sky.h" +#include "stats.h" +#include "v_video.h" +#include "a_sharedglobal.h" +#include "c_console.h" +#include "c_dispatch.h" +#include "cmdlib.h" +#include "d_net.h" +#include "g_level.h" +#include "r_utility.h" +#include "d_player.h" +#include "swrenderer/scene/r_light.h" +#include "swrenderer/scene/r_viewport.h" + +CVAR(Bool, r_shadercolormaps, true, CVAR_ARCHIVE) +EXTERN_CVAR(Bool, r_fullbrightignoresectorcolor) + +namespace swrenderer +{ + double r_BaseVisibility; + double r_WallVisibility; + double r_FloorVisibility; + float r_TiltVisibility; + double r_SpriteVisibility; + double r_ParticleVisibility; + + double GlobVis; + + FDynamicColormap *basecolormap; // [RH] colormap currently drawing with + int fixedlightlev; + FSWColormap *fixedcolormap; + FSpecialColormap *realfixedcolormap; + + bool foggy; // [RH] ignore extralight and fullbright? + int r_actualextralight; + + namespace + { + double CurrentVisibility = 8.f; + double MaxVisForWall; + double MaxVisForFloor; + } + + // Changes how rapidly things get dark with distance + void R_SetVisibility(double vis) + { + // Allow negative visibilities, just for novelty's sake + vis = clamp(vis, -204.7, 204.7); // (205 and larger do not work in 5:4 aspect ratio) + + CurrentVisibility = vis; + + if (FocalTangent == 0 || FocalLengthY == 0) + { // If r_visibility is called before the renderer is all set up, don't + // divide by zero. This will be called again later, and the proper + // values can be initialized then. + return; + } + + r_BaseVisibility = vis; + + MaxVisForWall = (InvZtoScale * (SCREENWIDTH*r_Yaspect) / (viewwidth*SCREENHEIGHT * FocalTangent)); + MaxVisForWall = 32767.0 / MaxVisForWall; + MaxVisForFloor = 32767.0 / (viewheight >> 2) * FocalLengthY / 160; + + // Prevent overflow on walls + if (r_BaseVisibility < 0 && r_BaseVisibility < -MaxVisForWall) + r_WallVisibility = -MaxVisForWall; + else if (r_BaseVisibility > 0 && r_BaseVisibility > MaxVisForWall) + r_WallVisibility = MaxVisForWall; + else + r_WallVisibility = r_BaseVisibility; + + r_WallVisibility = (InvZtoScale * SCREENWIDTH*AspectBaseHeight(WidescreenRatio) / + (viewwidth*SCREENHEIGHT * 3)) * (r_WallVisibility * FocalTangent); + + // Prevent overflow on floors/ceilings. Note that the calculation of + // MaxVisForFloor means that planes less than two units from the player's + // view could still overflow, but there is no way to totally eliminate + // that while still using fixed point math. + if (r_BaseVisibility < 0 && r_BaseVisibility < -MaxVisForFloor) + r_FloorVisibility = -MaxVisForFloor; + else if (r_BaseVisibility > 0 && r_BaseVisibility > MaxVisForFloor) + r_FloorVisibility = MaxVisForFloor; + else + r_FloorVisibility = r_BaseVisibility; + + r_FloorVisibility = 160.0 * r_FloorVisibility / FocalLengthY; + + r_TiltVisibility = float(vis * FocalTangent * (16.f * 320.f) / viewwidth); + r_SpriteVisibility = r_WallVisibility; + } + + double R_GetVisibility() + { + return CurrentVisibility; + } + + void R_SetupColormap(player_t *player) + { + realfixedcolormap = NULL; + fixedcolormap = NULL; + fixedlightlev = -1; + + if (player != NULL && camera == player->mo) + { + if (player->fixedcolormap >= 0 && player->fixedcolormap < (int)SpecialColormaps.Size()) + { + realfixedcolormap = &SpecialColormaps[player->fixedcolormap]; + if (RenderTarget == screen && (r_swtruecolor || ((DFrameBuffer *)screen->Accel2D && r_shadercolormaps))) + { + // Render everything fullbright. The copy to video memory will + // apply the special colormap, so it won't be restricted to the + // palette. + fixedcolormap = &realcolormaps; + } + else + { + fixedcolormap = &SpecialColormaps[player->fixedcolormap]; + } + } + else if (player->fixedlightlevel >= 0 && player->fixedlightlevel < NUMCOLORMAPS) + { + fixedlightlev = player->fixedlightlevel * 256; + // [SP] Emulate GZDoom's light-amp goggles. + if (r_fullbrightignoresectorcolor && fixedlightlev >= 0) + { + fixedcolormap = &FullNormalLight; + } + } + } + // [RH] Inverse light for shooting the Sigil + if (fixedcolormap == NULL && extralight == INT_MIN) + { + fixedcolormap = &SpecialColormaps[INVERSECOLORMAP]; + extralight = 0; + } + } + + // Controls how quickly light ramps across a 1/z range. Set this, and it + // sets all the r_*Visibility variables (except r_SkyVisibilily, which is + // currently unused). + CCMD(r_visibility) + { + if (argv.argc() < 2) + { + Printf("Visibility is %g\n", R_GetVisibility()); + } + else if (!netgame) + { + R_SetVisibility(atof(argv[1])); + } + else + { + Printf("Visibility cannot be changed in net games.\n"); + } + } +} diff --git a/src/swrenderer/scene/r_light.h b/src/swrenderer/scene/r_light.h new file mode 100644 index 000000000..eab64f094 --- /dev/null +++ b/src/swrenderer/scene/r_light.h @@ -0,0 +1,73 @@ +// +// Copyright (C) 1993-1996 by id Software, Inc. +// +// This source is available for distribution and/or modification +// only under the terms of the DOOM Source Code License as +// published by id Software. All rights reserved. +// +// The source is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License +// for more details. +// + +#pragma once + +#include +#include "r_defs.h" +#include "v_palette.h" +#include "r_data/colormaps.h" +#include "r_utility.h" + +// Lighting. +// +// [RH] This has changed significantly from Doom, which used lookup +// tables based on 1/z for walls and z for flats and only recognized +// 16 discrete light levels. The terminology I use is borrowed from Build. + +// The size of a single colormap, in bits +#define COLORMAPSHIFT 8 + +// Convert a light level into an unbounded colormap index (shade). Result is +// fixed point. Why the +12? I wish I knew, but experimentation indicates it +// is necessary in order to best reproduce Doom's original lighting. +#define LIGHT2SHADE(l) ((NUMCOLORMAPS*2*FRACUNIT)-(((l)+12)*(FRACUNIT*NUMCOLORMAPS/128))) + +// MAXLIGHTSCALE from original DOOM, divided by 2. +#define MAXLIGHTVIS (24.0) + +// Convert a shade and visibility to a clamped colormap index. +// Result is not fixed point. +// Change R_CalcTiltedLighting() when this changes. +#define GETPALOOKUP(vis,shade) (clamp (((shade)-FLOAT2FIXED(MIN(MAXLIGHTVIS,double(vis))))>>FRACBITS, 0, NUMCOLORMAPS-1)) + +// Calculate the light multiplier for dc_light/ds_light +// This is used instead of GETPALOOKUP when ds_colormap/dc_colormap is set to the base colormap +// Returns a value between 0 and 1 in fixed point +#define LIGHTSCALE(vis,shade) FLOAT2FIXED(clamp((FIXED2DBL(shade) - (MIN(MAXLIGHTVIS,double(vis)))) / NUMCOLORMAPS, 0.0, (NUMCOLORMAPS-1)/(double)NUMCOLORMAPS)) + +// Converts fixedlightlev into a shade value +#define FIXEDLIGHT2SHADE(lightlev) (((lightlev) >> COLORMAPSHIFT) << FRACBITS) + +namespace swrenderer +{ + extern double r_BaseVisibility; + extern double r_WallVisibility; + extern double r_FloorVisibility; + extern float r_TiltVisibility; + extern double r_SpriteVisibility; + + extern double GlobVis; + + extern int r_actualextralight; + extern bool foggy; + extern int fixedlightlev; + extern FSWColormap *fixedcolormap; + extern FSpecialColormap *realfixedcolormap; + extern FDynamicColormap *basecolormap; // [RH] Colormap for sector currently being drawn + + void R_SetVisibility(double visibility); + double R_GetVisibility(); + + void R_SetupColormap(player_t *); +} diff --git a/src/swrenderer/scene/r_opaque_pass.cpp b/src/swrenderer/scene/r_opaque_pass.cpp index f43c26932..7cdc30834 100644 --- a/src/swrenderer/scene/r_opaque_pass.cpp +++ b/src/swrenderer/scene/r_opaque_pass.cpp @@ -32,7 +32,6 @@ #include "p_lnspec.h" #include "p_setup.h" -#include "swrenderer/r_main.h" #include "swrenderer/drawers/r_draw.h" #include "swrenderer/plane/r_visibleplane.h" #include "swrenderer/plane/r_visibleplanelist.h" @@ -42,6 +41,9 @@ #include "swrenderer/things/r_particle.h" #include "swrenderer/segments/r_clipsegment.h" #include "swrenderer/line/r_wallsetup.h" +#include "swrenderer/scene/r_scene.h" +#include "swrenderer/scene/r_viewport.h" +#include "swrenderer/scene/r_light.h" #include "r_3dfloors.h" #include "r_portal.h" #include "a_sharedglobal.h" diff --git a/src/swrenderer/scene/r_portal.cpp b/src/swrenderer/scene/r_portal.cpp index 1ff62438a..6c89d9fc5 100644 --- a/src/swrenderer/scene/r_portal.cpp +++ b/src/swrenderer/scene/r_portal.cpp @@ -52,7 +52,9 @@ #include "swrenderer/things/r_visiblesprite.h" #include "swrenderer/scene/r_opaque_pass.h" #include "swrenderer/scene/r_translucent_pass.h" -#include "swrenderer/r_main.h" +#include "swrenderer/scene/r_scene.h" +#include "swrenderer/scene/r_viewport.h" +#include "swrenderer/scene/r_light.h" #include "swrenderer/r_memory.h" CVAR(Int, r_portal_recursions, 4, CVAR_ARCHIVE) diff --git a/src/swrenderer/scene/r_scene.cpp b/src/swrenderer/scene/r_scene.cpp new file mode 100644 index 000000000..50e20be72 --- /dev/null +++ b/src/swrenderer/scene/r_scene.cpp @@ -0,0 +1,270 @@ +// +// Copyright (C) 1993-1996 by id Software, Inc. +// +// This source is available for distribution and/or modification +// only under the terms of the DOOM Source Code License as +// published by id Software. All rights reserved. +// +// The source is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License +// for more details. +// + +#include +#include + +#include "templates.h" +#include "i_system.h" +#include "w_wad.h" +#include "doomdef.h" +#include "doomstat.h" +#include "r_sky.h" +#include "stats.h" +#include "v_video.h" +#include "a_sharedglobal.h" +#include "c_console.h" +#include "c_dispatch.h" +#include "cmdlib.h" +#include "d_net.h" +#include "g_level.h" +#include "p_effect.h" +#include "po_man.h" +#include "r_data/r_interpolate.h" +#include "swrenderer/scene/r_scene.h" +#include "swrenderer/scene/r_viewport.h" +#include "swrenderer/scene/r_light.h" +#include "swrenderer/scene/r_3dfloors.h" +#include "swrenderer/scene/r_opaque_pass.h" +#include "swrenderer/scene/r_translucent_pass.h" +#include "swrenderer/scene/r_portal.h" +#include "swrenderer/segments/r_clipsegment.h" +#include "swrenderer/segments/r_drawsegment.h" +#include "swrenderer/segments/r_portalsegment.h" +#include "swrenderer/plane/r_visibleplanelist.h" +#include "swrenderer/drawers/r_draw.h" +#include "swrenderer/drawers/r_thread.h" +#include "swrenderer/r_memory.h" + +EXTERN_CVAR(Bool, r_shadercolormaps) + +namespace swrenderer +{ + cycle_t WallCycles, PlaneCycles, MaskedCycles, WallScanCycles; + bool r_dontmaplines; + + void R_RenderActorView(AActor *actor, bool dontmaplines) + { + WallCycles.Reset(); + PlaneCycles.Reset(); + MaskedCycles.Reset(); + WallScanCycles.Reset(); + + Clip3DFloors *clip3d = Clip3DFloors::Instance(); + clip3d->fakeActive = false; // kg3D - reset fake floor indicator + clip3d->ResetClip(); // reset clips (floor/ceiling) + + R_SetupBuffer(); + R_SetupFrame(actor); + + // Clear buffers. + R_ClearClipSegs(0, viewwidth); + R_ClearDrawSegs(); + VisiblePlaneList::Instance()->Clear(true); + R_FreePlaneLights(); + RenderTranslucentPass::Clear(); + + // opening / clipping determination + RenderOpaquePass::Instance()->ClearClip(); + R_FreeOpenings(); + + NetUpdate(); + + colfunc = basecolfunc; + spanfunc = &SWPixelFormatDrawers::DrawSpan; + + RenderPortal::Instance()->SetMainPortal(); + + r_dontmaplines = dontmaplines; + + // [RH] Hack to make windows into underwater areas possible + RenderOpaquePass::Instance()->ResetFakingUnderwater(); + + // [RH] Setup particles for this frame + P_FindParticleSubsectors(); + + WallCycles.Clock(); + ActorRenderFlags savedflags = camera->renderflags; + // Never draw the player unless in chasecam mode + if (!r_showviewer) + { + camera->renderflags |= RF_INVISIBLE; + } + // Link the polyobjects right before drawing the scene to reduce the amounts of calls to this function + PO_LinkToSubsectors(); + RenderOpaquePass::Instance()->RenderScene(); + Clip3DFloors::Instance()->ResetClip(); // reset clips (floor/ceiling) + camera->renderflags = savedflags; + WallCycles.Unclock(); + + NetUpdate(); + + if (viewactive) + { + PlaneCycles.Clock(); + VisiblePlaneList::Instance()->Render(); + RenderPortal::Instance()->RenderPlanePortals(); + PlaneCycles.Unclock(); + + RenderPortal::Instance()->RenderLinePortals(); + + NetUpdate(); + + MaskedCycles.Clock(); + RenderTranslucentPass::Render(); + MaskedCycles.Unclock(); + + NetUpdate(); + } + WallPortals.Clear(); + interpolator.RestoreInterpolations(); + R_SetupBuffer(); + + // If we don't want shadered colormaps, NULL it now so that the + // copy to the screen does not use a special colormap shader. + if (!r_shadercolormaps && !r_swtruecolor) + { + realfixedcolormap = NULL; + } + } + + void R_RenderViewToCanvas(AActor *actor, DCanvas *canvas, int x, int y, int width, int height, bool dontmaplines) + { + const bool savedviewactive = viewactive; + const bool savedoutputformat = r_swtruecolor; + + if (r_swtruecolor != canvas->IsBgra()) + { + r_swtruecolor = canvas->IsBgra(); + R_InitColumnDrawers(); + } + + R_BeginDrawerCommands(); + + viewwidth = width; + RenderTarget = canvas; + bRenderingToCanvas = true; + + R_SetWindow(12, width, height, height, true); + viewwindowx = x; + viewwindowy = y; + viewactive = true; + + R_RenderActorView(actor, dontmaplines); + + R_EndDrawerCommands(); + + RenderTarget = screen; + bRenderingToCanvas = false; + R_ExecuteSetViewSize(); + screen->Lock(true); + R_SetupBuffer(); + screen->Unlock(); + + viewactive = savedviewactive; + r_swtruecolor = savedoutputformat; + + if (r_swtruecolor != canvas->IsBgra()) + { + R_InitColumnDrawers(); + } + } + + void R_MultiresInit() + { + VisiblePlaneList::Instance()->Init(); + } + + void R_InitRenderer() + { + atterm(R_ShutdownRenderer); + // viewwidth / viewheight are set by the defaults + fillshort(zeroarray, MAXWIDTH, 0); + + R_InitShadeMaps(); + R_InitColumnDrawers(); + } + + void R_ShutdownRenderer() + { + RenderTranslucentPass::Deinit(); + VisiblePlaneList::Instance()->Deinit(); + Clip3DFloors::Instance()->Cleanup(); + R_DeinitOpenings(); + R_FreeDrawSegs(); + } + + ///////////////////////////////////////////////////////////////////////// + + ADD_STAT(fps) + { + FString out; + out.Format("frame=%04.1f ms walls=%04.1f ms planes=%04.1f ms masked=%04.1f ms", + FrameCycles.TimeMS(), WallCycles.TimeMS(), PlaneCycles.TimeMS(), MaskedCycles.TimeMS()); + return out; + } + + static double f_acc, w_acc, p_acc, m_acc; + static int acc_c; + + ADD_STAT(fps_accumulated) + { + f_acc += FrameCycles.TimeMS(); + w_acc += WallCycles.TimeMS(); + p_acc += PlaneCycles.TimeMS(); + m_acc += MaskedCycles.TimeMS(); + acc_c++; + FString out; + out.Format("frame=%04.1f ms walls=%04.1f ms planes=%04.1f ms masked=%04.1f ms %d counts", + f_acc / acc_c, w_acc / acc_c, p_acc / acc_c, m_acc / acc_c, acc_c); + Printf(PRINT_LOG, "%s\n", out.GetChars()); + return out; + } + + static double bestwallcycles = HUGE_VAL; + + ADD_STAT(wallcycles) + { + FString out; + double cycles = WallCycles.Time(); + if (cycles && cycles < bestwallcycles) + bestwallcycles = cycles; + out.Format("%g", bestwallcycles); + return out; + } + + CCMD(clearwallcycles) + { + bestwallcycles = HUGE_VAL; + } + +#if 0 + // The replacement code for Build's wallscan doesn't have any timing calls so this does not work anymore. + static double bestscancycles = HUGE_VAL; + + ADD_STAT(scancycles) + { + FString out; + double scancycles = WallScanCycles.Time(); + if (scancycles && scancycles < bestscancycles) + bestscancycles = scancycles; + out.Format("%g", bestscancycles); + return out; + } + + CCMD(clearscancycles) + { + bestscancycles = HUGE_VAL; + } +#endif +} diff --git a/src/swrenderer/scene/r_scene.h b/src/swrenderer/scene/r_scene.h new file mode 100644 index 000000000..5b5a951bc --- /dev/null +++ b/src/swrenderer/scene/r_scene.h @@ -0,0 +1,34 @@ +// +// Copyright (C) 1993-1996 by id Software, Inc. +// +// This source is available for distribution and/or modification +// only under the terms of the DOOM Source Code License as +// published by id Software. All rights reserved. +// +// The source is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License +// for more details. +// + +#pragma once + +#include +#include "r_defs.h" +#include "d_player.h" + +extern cycle_t FrameCycles; + +namespace swrenderer +{ + extern cycle_t WallCycles, PlaneCycles, MaskedCycles, WallScanCycles; + + extern bool r_dontmaplines; + + void R_RenderActorView(AActor *actor, bool dontmaplines = false); + void R_RenderViewToCanvas(AActor *actor, DCanvas *canvas, int x, int y, int width, int height, bool dontmaplines = false); + + void R_InitRenderer(); + void R_MultiresInit(); + void R_ShutdownRenderer(); +} diff --git a/src/swrenderer/scene/r_translucent_pass.cpp b/src/swrenderer/scene/r_translucent_pass.cpp index 6b6db1caa..9edbe972e 100644 --- a/src/swrenderer/scene/r_translucent_pass.cpp +++ b/src/swrenderer/scene/r_translucent_pass.cpp @@ -22,7 +22,6 @@ #include "w_wad.h" #include "g_levellocals.h" #include "p_maputl.h" -#include "swrenderer/r_main.h" #include "swrenderer/things/r_visiblesprite.h" #include "swrenderer/things/r_visiblespritelist.h" #include "swrenderer/things/r_voxel.h" @@ -33,6 +32,8 @@ #include "swrenderer/segments/r_drawsegment.h" #include "swrenderer/scene/r_portal.h" #include "swrenderer/scene/r_translucent_pass.h" +#include "swrenderer/scene/r_viewport.h" +#include "swrenderer/scene/r_light.h" #include "swrenderer/plane/r_visibleplane.h" #include "swrenderer/plane/r_visibleplanelist.h" #include "swrenderer/r_memory.h" diff --git a/src/swrenderer/scene/r_viewport.cpp b/src/swrenderer/scene/r_viewport.cpp new file mode 100644 index 000000000..7812fab65 --- /dev/null +++ b/src/swrenderer/scene/r_viewport.cpp @@ -0,0 +1,195 @@ +// +// Copyright (C) 1993-1996 by id Software, Inc. +// +// This source is available for distribution and/or modification +// only under the terms of the DOOM Source Code License as +// published by id Software. All rights reserved. +// +// The source is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License +// for more details. +// + +#include +#include + +#include "templates.h" +#include "i_system.h" +#include "w_wad.h" +#include "doomdef.h" +#include "doomstat.h" +#include "r_sky.h" +#include "stats.h" +#include "v_video.h" +#include "a_sharedglobal.h" +#include "c_console.h" +#include "cmdlib.h" +#include "d_net.h" +#include "g_level.h" +#include "r_utility.h" +#include "swrenderer/scene/r_viewport.h" +#include "swrenderer/scene/r_light.h" +#include "swrenderer/drawers/r_draw.h" +#include "swrenderer/things/r_playersprite.h" +#include "swrenderer/plane/r_flatplane.h" + +CVAR(String, r_viewsize, "", CVAR_NOSET) + +namespace swrenderer +{ + bool r_swtruecolor; + + fixed_t viewingrangerecip; + double FocalLengthX; + double FocalLengthY; + + bool bRenderingToCanvas; + double globaluclip, globaldclip; + double CenterX, CenterY; + double YaspectMul; + double BaseYaspectMul; // yaspectmul without a forced aspect ratio + double IYaspectMul; + double InvZtoScale; + + double WallTMapScale2; + + // The xtoviewangleangle[] table maps a screen pixel + // to the lowest viewangle that maps back to x ranges + // from clipangle to -clipangle. + angle_t xtoviewangle[MAXWIDTH + 1]; + + void R_SWRSetWindow(int windowSize, int fullWidth, int fullHeight, int stHeight, float trueratio) + { + int virtheight, virtwidth, virtwidth2, virtheight2; + + if (!bRenderingToCanvas) + { // Set r_viewsize cvar to reflect the current view size + UCVarValue value; + char temp[16]; + + mysnprintf(temp, countof(temp), "%d x %d", viewwidth, viewheight); + value.String = temp; + r_viewsize.ForceSet(value, CVAR_String); + } + + fuzzviewheight = viewheight - 2; // Maximum row the fuzzer can draw to + + CenterX = centerx; + CenterY = centery; + + virtwidth = virtwidth2 = fullWidth; + virtheight = virtheight2 = fullHeight; + + if (AspectTallerThanWide(trueratio)) + { + virtheight2 = virtheight2 * AspectMultiplier(trueratio) / 48; + } + else + { + virtwidth2 = virtwidth2 * AspectMultiplier(trueratio) / 48; + } + + if (AspectTallerThanWide(WidescreenRatio)) + { + virtheight = virtheight * AspectMultiplier(WidescreenRatio) / 48; + } + else + { + virtwidth = virtwidth * AspectMultiplier(WidescreenRatio) / 48; + } + + BaseYaspectMul = 320.0 * virtheight2 / (r_Yaspect * virtwidth2); + YaspectMul = 320.0 * virtheight / (r_Yaspect * virtwidth); + IYaspectMul = (double)virtwidth * r_Yaspect / 320.0 / virtheight; + InvZtoScale = YaspectMul * CenterX; + + WallTMapScale2 = IYaspectMul / CenterX; + + // psprite scales + RenderPlayerSprite::SetupSpriteScale(); + + // thing clipping + fillshort(screenheightarray, viewwidth, (short)viewheight); + + R_InitTextureMapping(); + + // Reset r_*Visibility vars + R_SetVisibility(R_GetVisibility()); + } + + void R_SetupFreelook() + { + double dy; + + if (camera != NULL) + { + dy = FocalLengthY * (-ViewPitch).Tan(); + } + else + { + dy = 0; + } + + CenterY = (viewheight / 2.0) + dy; + centery = xs_ToInt(CenterY); + globaluclip = -CenterY / InvZtoScale; + globaldclip = (viewheight - CenterY) / InvZtoScale; + + RenderFlatPlane::SetupSlope(); + } + + void R_SetupBuffer() + { + using namespace drawerargs; + + static BYTE *lastbuff = NULL; + + int pitch = RenderTarget->GetPitch(); + int pixelsize = r_swtruecolor ? 4 : 1; + BYTE *lineptr = RenderTarget->GetBuffer() + (viewwindowy*pitch + viewwindowx) * pixelsize; + + if (dc_pitch != pitch || lineptr != lastbuff) + { + if (dc_pitch != pitch) + { + dc_pitch = pitch; + R_InitFuzzTable(pitch); + } + dc_destorg = lineptr; + dc_destheight = RenderTarget->GetHeight() - viewwindowy; + for (int i = 0; i < RenderTarget->GetHeight(); i++) + { + ylookup[i] = i * pitch; + } + } + } + + void R_InitTextureMapping() + { + int i; + + // Calc focallength so FieldOfView angles cover viewwidth. + FocalLengthX = CenterX / FocalTangent; + FocalLengthY = FocalLengthX * YaspectMul; + + // This is 1/FocalTangent before the widescreen extension of FOV. + viewingrangerecip = FLOAT2FIXED(1. / tan(FieldOfView.Radians() / 2)); + + + // Now generate xtoviewangle for sky texture mapping. + // [RH] Do not generate viewangletox, because texture mapping is no + // longer done with trig, so it's not needed. + const double slopestep = FocalTangent / centerx; + double slope; + + for (i = centerx, slope = 0; i <= viewwidth; i++, slope += slopestep) + { + xtoviewangle[i] = angle_t((2 * M_PI - atan(slope)) * (ANGLE_180 / M_PI)); + } + for (i = 0; i < centerx; i++) + { + xtoviewangle[i] = 0 - xtoviewangle[viewwidth - i - 1]; + } + } +} diff --git a/src/swrenderer/scene/r_viewport.h b/src/swrenderer/scene/r_viewport.h new file mode 100644 index 000000000..2fa32988e --- /dev/null +++ b/src/swrenderer/scene/r_viewport.h @@ -0,0 +1,41 @@ +// +// Copyright (C) 1993-1996 by id Software, Inc. +// +// This source is available for distribution and/or modification +// only under the terms of the DOOM Source Code License as +// published by id Software. All rights reserved. +// +// The source is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License +// for more details. +// + +#pragma once + +#include +#include "r_defs.h" + +namespace swrenderer +{ + extern bool bRenderingToCanvas; + extern fixed_t viewingrangerecip; + extern double FocalLengthX; + extern double FocalLengthY; + extern double InvZtoScale; + extern double WallTMapScale2; + extern double CenterX; + extern double CenterY; + extern double YaspectMul; + extern double IYaspectMul; + extern bool r_swtruecolor; + extern double globaluclip; + extern double globaldclip; + extern angle_t xtoviewangle[MAXWIDTH + 1]; + + void R_SWRSetWindow(int windowSize, int fullWidth, int fullHeight, int stHeight, float trueratio); + void R_InitTextureMapping(); + void R_SetupBuffer(); + void R_SetupFreelook(); + void R_InitRenderer(); +} diff --git a/src/swrenderer/segments/r_clipsegment.cpp b/src/swrenderer/segments/r_clipsegment.cpp index 66dbc354f..593a253e3 100644 --- a/src/swrenderer/segments/r_clipsegment.cpp +++ b/src/swrenderer/segments/r_clipsegment.cpp @@ -18,7 +18,6 @@ #include "i_system.h" #include "p_lnspec.h" #include "p_setup.h" -#include "swrenderer/r_main.h" #include "swrenderer/drawers/r_draw.h" #include "swrenderer/scene/r_3dfloors.h" #include "a_sharedglobal.h" diff --git a/src/swrenderer/segments/r_drawsegment.cpp b/src/swrenderer/segments/r_drawsegment.cpp index 99ad33cef..37356da0a 100644 --- a/src/swrenderer/segments/r_drawsegment.cpp +++ b/src/swrenderer/segments/r_drawsegment.cpp @@ -28,7 +28,6 @@ #include "po_man.h" #include "r_data/colormaps.h" #include "d_net.h" -#include "swrenderer/r_main.h" #include "swrenderer/r_memory.h" #include "swrenderer/drawers/r_draw.h" #include "swrenderer/scene/r_3dfloors.h" @@ -39,6 +38,8 @@ #include "swrenderer/line/r_fogboundary.h" #include "swrenderer/segments/r_drawsegment.h" #include "swrenderer/things/r_visiblesprite.h" +#include "swrenderer/scene/r_light.h" +#include "swrenderer/scene/r_viewport.h" EXTERN_CVAR(Bool, r_fullbrightignoresectorcolor); diff --git a/src/swrenderer/segments/r_portalsegment.cpp b/src/swrenderer/segments/r_portalsegment.cpp index a1bb2bb74..302dbe3c9 100644 --- a/src/swrenderer/segments/r_portalsegment.cpp +++ b/src/swrenderer/segments/r_portalsegment.cpp @@ -18,7 +18,6 @@ #include "i_system.h" #include "p_lnspec.h" #include "p_setup.h" -#include "swrenderer/r_main.h" #include "swrenderer/drawers/r_draw.h" #include "swrenderer/scene/r_3dfloors.h" #include "a_sharedglobal.h" diff --git a/src/swrenderer/things/r_decal.cpp b/src/swrenderer/things/r_decal.cpp index 59db70b8c..e1f2da1c7 100644 --- a/src/swrenderer/things/r_decal.cpp +++ b/src/swrenderer/things/r_decal.cpp @@ -19,7 +19,6 @@ #include "doomstat.h" #include "doomdata.h" #include "p_lnspec.h" -#include "swrenderer/r_main.h" #include "r_sky.h" #include "v_video.h" #include "m_swap.h" @@ -38,6 +37,9 @@ #include "swrenderer/line/r_walldraw.h" #include "swrenderer/segments/r_drawsegment.h" #include "swrenderer/scene/r_portal.h" +#include "swrenderer/scene/r_scene.h" +#include "swrenderer/scene/r_viewport.h" +#include "swrenderer/scene/r_light.h" #include "swrenderer/things/r_wallsprite.h" #include "swrenderer/r_memory.h" diff --git a/src/swrenderer/things/r_particle.cpp b/src/swrenderer/things/r_particle.cpp index 079b229fc..ae5b34978 100644 --- a/src/swrenderer/things/r_particle.cpp +++ b/src/swrenderer/things/r_particle.cpp @@ -20,7 +20,6 @@ #include "m_swap.h" #include "i_system.h" #include "w_wad.h" -#include "swrenderer/r_main.h" #include "swrenderer/things/r_particle.h" #include "c_console.h" #include "c_cvars.h" @@ -53,6 +52,8 @@ #include "swrenderer/segments/r_drawsegment.h" #include "swrenderer/scene/r_portal.h" #include "swrenderer/r_memory.h" +#include "swrenderer/scene/r_viewport.h" +#include "swrenderer/scene/r_light.h" EXTERN_CVAR(Bool, r_fullbrightignoresectorcolor); diff --git a/src/swrenderer/things/r_playersprite.cpp b/src/swrenderer/things/r_playersprite.cpp index e53a9b2bc..1efc780f0 100644 --- a/src/swrenderer/things/r_playersprite.cpp +++ b/src/swrenderer/things/r_playersprite.cpp @@ -20,7 +20,6 @@ #include "m_swap.h" #include "i_system.h" #include "w_wad.h" -#include "swrenderer/r_main.h" #include "swrenderer/things/r_playersprite.h" #include "c_console.h" #include "c_cvars.h" @@ -51,6 +50,9 @@ #include "r_voxel.h" #include "swrenderer/segments/r_drawsegment.h" #include "swrenderer/scene/r_portal.h" +#include "swrenderer/scene/r_scene.h" +#include "swrenderer/scene/r_viewport.h" +#include "swrenderer/scene/r_light.h" #include "swrenderer/things/r_sprite.h" #include "swrenderer/r_memory.h" #include "g_levellocals.h" diff --git a/src/swrenderer/things/r_playersprite.h b/src/swrenderer/things/r_playersprite.h index 293cf9d3a..6030c2ad3 100644 --- a/src/swrenderer/things/r_playersprite.h +++ b/src/swrenderer/things/r_playersprite.h @@ -15,6 +15,8 @@ #include "r_visiblesprite.h" +class DPSprite; + namespace swrenderer { class RenderPlayerSprite diff --git a/src/swrenderer/things/r_sprite.cpp b/src/swrenderer/things/r_sprite.cpp index c75720afe..f689d6eb0 100644 --- a/src/swrenderer/things/r_sprite.cpp +++ b/src/swrenderer/things/r_sprite.cpp @@ -20,7 +20,6 @@ #include "m_swap.h" #include "i_system.h" #include "w_wad.h" -#include "swrenderer/r_main.h" #include "swrenderer/things/r_wallsprite.h" #include "c_console.h" #include "c_cvars.h" @@ -51,6 +50,9 @@ #include "r_voxel.h" #include "swrenderer/segments/r_drawsegment.h" #include "swrenderer/scene/r_portal.h" +#include "swrenderer/scene/r_scene.h" +#include "swrenderer/scene/r_viewport.h" +#include "swrenderer/scene/r_light.h" #include "swrenderer/things/r_sprite.h" #include "swrenderer/r_memory.h" diff --git a/src/swrenderer/things/r_visiblesprite.cpp b/src/swrenderer/things/r_visiblesprite.cpp index 2eb52770e..71f036c9a 100644 --- a/src/swrenderer/things/r_visiblesprite.cpp +++ b/src/swrenderer/things/r_visiblesprite.cpp @@ -22,7 +22,6 @@ #include "w_wad.h" #include "g_levellocals.h" #include "p_maputl.h" -#include "swrenderer/r_main.h" #include "swrenderer/things/r_visiblesprite.h" #include "swrenderer/things/r_voxel.h" #include "swrenderer/things/r_particle.h" diff --git a/src/swrenderer/things/r_visiblespritelist.cpp b/src/swrenderer/things/r_visiblespritelist.cpp index fff4dce8e..db6689c80 100644 --- a/src/swrenderer/things/r_visiblespritelist.cpp +++ b/src/swrenderer/things/r_visiblespritelist.cpp @@ -22,7 +22,6 @@ #include "w_wad.h" #include "g_levellocals.h" #include "p_maputl.h" -#include "swrenderer/r_main.h" #include "swrenderer/things/r_visiblesprite.h" #include "swrenderer/things/r_visiblespritelist.h" #include "swrenderer/r_memory.h" diff --git a/src/swrenderer/things/r_voxel.cpp b/src/swrenderer/things/r_voxel.cpp index da9adc6be..7770b46e4 100644 --- a/src/swrenderer/things/r_voxel.cpp +++ b/src/swrenderer/things/r_voxel.cpp @@ -38,7 +38,9 @@ #include "swrenderer/things/r_voxel.h" #include "swrenderer/scene/r_portal.h" #include "swrenderer/scene/r_translucent_pass.h" -#include "swrenderer/r_main.h" +#include "swrenderer/scene/r_scene.h" +#include "swrenderer/scene/r_viewport.h" +#include "swrenderer/scene/r_light.h" EXTERN_CVAR(Bool, r_fullbrightignoresectorcolor) diff --git a/src/swrenderer/things/r_wallsprite.cpp b/src/swrenderer/things/r_wallsprite.cpp index de4da612d..2d1455a1a 100644 --- a/src/swrenderer/things/r_wallsprite.cpp +++ b/src/swrenderer/things/r_wallsprite.cpp @@ -20,7 +20,6 @@ #include "m_swap.h" #include "i_system.h" #include "w_wad.h" -#include "swrenderer/r_main.h" #include "swrenderer/things/r_wallsprite.h" #include "c_console.h" #include "c_cvars.h" @@ -52,6 +51,9 @@ #include "r_voxel.h" #include "swrenderer/segments/r_drawsegment.h" #include "swrenderer/scene/r_portal.h" +#include "swrenderer/scene/r_scene.h" +#include "swrenderer/scene/r_viewport.h" +#include "swrenderer/scene/r_light.h" #include "swrenderer/line/r_wallsetup.h" #include "swrenderer/line/r_walldraw.h" #include "swrenderer/r_memory.h" diff --git a/src/v_draw.cpp b/src/v_draw.cpp index a285fdd1e..689546f8c 100644 --- a/src/v_draw.cpp +++ b/src/v_draw.cpp @@ -45,7 +45,8 @@ #ifndef NO_SWRENDER #include "swrenderer/drawers/r_draw.h" #include "swrenderer/drawers/r_draw_rgba.h" -#include "swrenderer/r_main.h" +#include "swrenderer/scene/r_light.h" +#include "swrenderer/scene/r_viewport.h" #endif #include "r_data/r_translate.h" #include "doomstat.h" diff --git a/src/win32/fb_d3d9.cpp b/src/win32/fb_d3d9.cpp index cf627f4d7..d28ef2246 100644 --- a/src/win32/fb_d3d9.cpp +++ b/src/win32/fb_d3d9.cpp @@ -63,7 +63,6 @@ #include "v_pfx.h" #include "stats.h" #include "doomerrors.h" -#include "swrenderer/r_main.h" #include "r_data/r_translate.h" #include "f_wipe.h" #include "sbar.h" @@ -73,6 +72,7 @@ #include "w_wad.h" #include "r_data/colormaps.h" #include "SkylineBinPack.h" +#include "swrenderer/scene/r_light.h" // MACROS ------------------------------------------------------------------