From 369c53504d92aeff2def4d80382243741dbf1772 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Mon, 6 Mar 2017 22:19:55 -0500 Subject: [PATCH] Revert "Removal of the software renderer, part 1." This reverts commit eec89b757557f9786732202055b6b3f8449abf8f. # Conflicts: # src/win32/hardware.cpp --- src/CMakeLists.txt | 1 + src/posix/cocoa/i_video.mm | 7 +- src/posix/sdl/hardware.cpp | 14 +- src/posix/sdl/sdlvideo.cpp | 1 + src/r_swrenderer.cpp | 302 +++++++++++++++++++++++++++++++++++++ src/r_swrenderer.h | 41 +++++ src/win32/hardware.cpp | 19 ++- src/win32/win32iface.h | 1 + src/win32/win32video.cpp | 1 + 9 files changed, 376 insertions(+), 11 deletions(-) create mode 100644 src/r_swrenderer.cpp create mode 100644 src/r_swrenderer.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b52de0266..d8e818d10 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -639,6 +639,7 @@ set( NOT_COMPILED_SOURCE_FILES ) set( FASTMATH_PCH_SOURCES + r_swrenderer.cpp r_3dfloors.cpp r_bsp.cpp r_draw.cpp diff --git a/src/posix/cocoa/i_video.mm b/src/posix/cocoa/i_video.mm index 44a174a9a..637ca0d7f 100644 --- a/src/posix/cocoa/i_video.mm +++ b/src/posix/cocoa/i_video.mm @@ -48,6 +48,7 @@ #include "m_argv.h" #include "m_png.h" #include "r_renderer.h" +#include "r_swrenderer.h" #include "st_console.h" #include "stats.h" #include "textures.h" @@ -1312,13 +1313,15 @@ static void I_DeleteRenderer() void I_CreateRenderer() { - //s_currentRenderer = vid_renderer; + s_currentRenderer = vid_renderer; if (NULL == Renderer) { extern FRenderer* gl_CreateInterface(); - Renderer = gl_CreateInterface(); + Renderer = 1 == s_currentRenderer + ? gl_CreateInterface() + : new FSoftwareRenderer; atterm(I_DeleteRenderer); } } diff --git a/src/posix/sdl/hardware.cpp b/src/posix/sdl/hardware.cpp index 4bb7748a8..beb16576c 100644 --- a/src/posix/sdl/hardware.cpp +++ b/src/posix/sdl/hardware.cpp @@ -49,6 +49,7 @@ #include "m_argv.h" #include "sdlglvideo.h" #include "r_renderer.h" +#include "r_swrenderer.h" EXTERN_CVAR (Bool, ticker) EXTERN_CVAR (Bool, fullscreen) @@ -65,16 +66,22 @@ int currentrenderer; // [ZDoomGL] CUSTOM_CVAR (Int, vid_renderer, 1, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) { + // 0: Software renderer + // 1: OpenGL renderer + if (self != currentrenderer) { switch (self) { + case 0: + Printf("Switching to software renderer...\n"); + break; case 1: Printf("Switching to OpenGL renderer...\n"); break; default: - Printf("Unknown renderer (%d). Falling back to the OpenGL renderer...\n", (int) vid_renderer); - self = 1; // make sure to actually switch to the OpenGL renderer + Printf("Unknown renderer (%d). Falling back to software renderer...\n", (int) vid_renderer); + self = 0; // make sure to actually switch to the software renderer break; } Printf("You must restart " GAMENAME " to switch the renderer\n"); @@ -133,7 +140,8 @@ void I_CreateRenderer() currentrenderer = vid_renderer; if (Renderer == NULL) { - Renderer = gl_CreateInterface(); + if (currentrenderer==1) Renderer = gl_CreateInterface(); + else Renderer = new FSoftwareRenderer; atterm(I_DeleteRenderer); } } diff --git a/src/posix/sdl/sdlvideo.cpp b/src/posix/sdl/sdlvideo.cpp index bba60d064..4a6833026 100644 --- a/src/posix/sdl/sdlvideo.cpp +++ b/src/posix/sdl/sdlvideo.cpp @@ -11,6 +11,7 @@ #include "stats.h" #include "v_palette.h" #include "sdlvideo.h" +#include "r_swrenderer.h" #include "version.h" #include diff --git a/src/r_swrenderer.cpp b/src/r_swrenderer.cpp new file mode 100644 index 000000000..7eb1e13e9 --- /dev/null +++ b/src/r_swrenderer.cpp @@ -0,0 +1,302 @@ +/* +** r_swrender.cpp +** Software renderer interface +** +**--------------------------------------------------------------------------- +** Copyright 2011 Christoph Oelckers +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. The name of the author may not be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**--------------------------------------------------------------------------- +** +*/ + + +#include "r_local.h" +#include "v_palette.h" +#include "v_video.h" +#include "m_png.h" +#include "r_bsp.h" +#include "r_swrenderer.h" +#include "r_3dfloors.h" +#include "textures/textures.h" +#include "r_data/voxels.h" + + +class FArchive; +void R_SWRSetWindow(int windowSize, int fullWidth, int fullHeight, int stHeight, int trueratio); +void R_SetupColormap(player_t *); +void R_SetupFreelook(); +void R_InitRenderer(); + +extern float LastFOV; + +//========================================================================== +// +// DCanvas :: Init +// +//========================================================================== + +void FSoftwareRenderer::Init() +{ + R_InitRenderer(); +} + +//========================================================================== +// +// DCanvas :: UsesColormap +// +//========================================================================== + +bool FSoftwareRenderer::UsesColormap() const +{ + return true; +} + +//=========================================================================== +// +// Texture precaching +// +//=========================================================================== + +void FSoftwareRenderer::PrecacheTexture(FTexture *tex, int cache) +{ + if (tex != NULL) + { + if (cache & FTextureManager::HIT_Columnmode) + { + const FTexture::Span *spanp; + tex->GetColumn(0, &spanp); + } + else if (cache != 0) + { + tex->GetPixels (); + } + else + { + tex->Unload (); + } + } +} + +//=========================================================================== +// +// Render the view +// +//=========================================================================== + +void FSoftwareRenderer::RenderView(player_t *player) +{ + R_RenderActorView (player->mo); + // [RH] Let cameras draw onto textures that were visible this frame. + FCanvasTextureInfo::UpdateAll (); +} + +//========================================================================== +// +// +// +//========================================================================== + +void FSoftwareRenderer::RemapVoxels() +{ + for (unsigned i=0; iRemap(); + } +} + +//=========================================================================== +// +// Render the view to a savegame picture +// +//=========================================================================== + +void FSoftwareRenderer::WriteSavePic (player_t *player, FILE *file, int width, int height) +{ + DCanvas *pic = new DSimpleCanvas (width, height); + PalEntry palette[256]; + + // Take a snapshot of the player's view + pic->ObjectFlags |= OF_Fixed; + pic->Lock (); + R_RenderViewToCanvas (player->mo, pic, 0, 0, width, height); + screen->GetFlashedPalette (palette); + M_CreatePNG (file, pic->GetBuffer(), palette, SS_PAL, width, height, pic->GetPitch()); + pic->Unlock (); + pic->Destroy(); + pic->ObjectFlags |= OF_YesReallyDelete; + delete pic; +} + +//=========================================================================== +// +// +// +//=========================================================================== + +void FSoftwareRenderer::DrawRemainingPlayerSprites() +{ + R_DrawRemainingPlayerSprites(); +} + +//=========================================================================== +// +// Get max. view angle (renderer specific information so it goes here now) +// +//=========================================================================== +#define MAX_DN_ANGLE 56 // Max looking down angle +#define MAX_UP_ANGLE 32 // Max looking up angle + +int FSoftwareRenderer::GetMaxViewPitch(bool down) +{ + return down ? MAX_DN_ANGLE : MAX_UP_ANGLE; +} + +//========================================================================== +// +// OnModeSet +// +// Called from V_SetResolution() +// +//========================================================================== + +void FSoftwareRenderer::OnModeSet () +{ + R_MultiresInit (); + + RenderTarget = screen; + screen->Lock (true); + R_SetupBuffer (); + screen->Unlock (); +} + +//=========================================================================== +// +// +// +//=========================================================================== + +void FSoftwareRenderer::ErrorCleanup () +{ + fakeActive = 0; + fake3D = 0; + while (CurrentSkybox) + { + R_3D_DeleteHeights(); + R_3D_LeaveSkybox(); + } + R_3D_ResetClip(); + R_3D_DeleteHeights(); +} + +//=========================================================================== +// +// +// +//=========================================================================== + +void FSoftwareRenderer::ClearBuffer(int color) +{ + memset(RenderTarget->GetBuffer(), color, RenderTarget->GetPitch() * RenderTarget->GetHeight()); +} + +//=========================================================================== +// +// +// +//=========================================================================== + +void FSoftwareRenderer::SetWindow (int windowSize, int fullWidth, int fullHeight, int stHeight, int trueratio) +{ + R_SWRSetWindow(windowSize, fullWidth, fullHeight, stHeight, trueratio); +} + +//=========================================================================== +// +// +// +//=========================================================================== + +void FSoftwareRenderer::SetupFrame(player_t *player) +{ + R_SetupColormap(player); + R_SetupFreelook(); +} + +//========================================================================== +// +// R_CopyStackedViewParameters +// +//========================================================================== + +void FSoftwareRenderer::CopyStackedViewParameters() +{ + R_CopyStackedViewParameters(); +} + +//========================================================================== +// +// +// +//========================================================================== + +void FSoftwareRenderer::RenderTextureView (FCanvasTexture *tex, AActor *viewpoint, int fov) +{ + BYTE *Pixels = const_cast(tex->GetPixels()); + DSimpleCanvas *Canvas = tex->GetCanvas(); + + // curse Doom's overuse of global variables in the renderer. + // These get clobbered by rendering to a camera texture but they need to be preserved so the final rendering can be done with the correct palette. + unsigned char *savecolormap = fixedcolormap; + FSpecialColormap *savecm = realfixedcolormap; + + float savedfov = LastFOV; + R_SetFOV ((float)fov); + R_RenderViewToCanvas (viewpoint, Canvas, 0, 0, tex->GetWidth(), tex->GetHeight(), tex->bFirstUpdate); + R_SetFOV (savedfov); + if (Pixels == Canvas->GetBuffer()) + { + FTexture::FlipSquareBlockRemap (Pixels, tex->GetWidth(), tex->GetHeight(), GPalette.Remap); + } + else + { + FTexture::FlipNonSquareBlockRemap (Pixels, Canvas->GetBuffer(), tex->GetWidth(), tex->GetHeight(), Canvas->GetPitch(), GPalette.Remap); + } + tex->SetUpdated(); + fixedcolormap = savecolormap; + realfixedcolormap = savecm; +} + +//========================================================================== +// +// +// +//========================================================================== + +sector_t *FSoftwareRenderer::FakeFlat(sector_t *sec, sector_t *tempsec, int *floorlightlevel, int *ceilinglightlevel, bool back) +{ + return R_FakeFlat(sec, tempsec, floorlightlevel, ceilinglightlevel, back); +} + diff --git a/src/r_swrenderer.h b/src/r_swrenderer.h new file mode 100644 index 000000000..939547797 --- /dev/null +++ b/src/r_swrenderer.h @@ -0,0 +1,41 @@ +#ifndef __R_SWRENDERER_H +#define __R_SWRENDERER_H + +#include "r_renderer.h" + +struct FSoftwareRenderer : public FRenderer +{ + // Can be overridden so that the colormaps for sector color/fade won't be built. + virtual bool UsesColormap() const; + + // precache one texture + virtual void PrecacheTexture(FTexture *tex, int cache); + + // render 3D view + virtual void RenderView(player_t *player); + + // Remap voxel palette + virtual void RemapVoxels(); + + // renders view to a savegame picture + virtual void WriteSavePic (player_t *player, FILE *file, int width, int height); + + // draws player sprites with hardware acceleration (only useful for software rendering) + virtual void DrawRemainingPlayerSprites(); + + virtual int GetMaxViewPitch(bool down); + + void OnModeSet (); + void ErrorCleanup (); + void ClearBuffer(int color); + void Init(); + void SetWindow (int windowSize, int fullWidth, int fullHeight, int stHeight, int trueratio); + void SetupFrame(player_t *player); + void CopyStackedViewParameters(); + void RenderTextureView (FCanvasTexture *tex, AActor *viewpoint, int fov); + sector_t *FakeFlat(sector_t *sec, sector_t *tempsec, int *floorlightlevel, int *ceilinglightlevel, bool back); + +}; + + +#endif diff --git a/src/win32/hardware.cpp b/src/win32/hardware.cpp index 1554a0396..fd92694cd 100644 --- a/src/win32/hardware.cpp +++ b/src/win32/hardware.cpp @@ -47,7 +47,7 @@ #include "doomstat.h" #include "m_argv.h" #include "version.h" -#include "r_renderer.h" +#include "r_swrenderer.h" EXTERN_CVAR (Bool, ticker) EXTERN_CVAR (Bool, fullscreen) @@ -73,16 +73,22 @@ bool changerenderer; // [ZDoomGL] CUSTOM_CVAR (Int, vid_renderer, 1, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) { + // 0: Software renderer + // 1: OpenGL renderer + if (self != currentrenderer) { switch (self) { + case 0: + Printf("Switching to software renderer...\n"); + break; case 1: Printf("Switching to OpenGL renderer...\n"); break; default: - Printf("Unknown renderer (%d). Falling back to the OpenGL renderer...\n", *vid_renderer); - self = 1; // make sure to actually switch to the OpenGL renderer + Printf("Unknown renderer (%d). Falling back to software renderer...\n", *vid_renderer); + self = 0; // make sure to actually switch to the software renderer break; } //changerenderer = true; @@ -149,10 +155,11 @@ static void I_DeleteRenderer() void I_CreateRenderer() { - //currentrenderer = vid_renderer; + currentrenderer = vid_renderer; if (Renderer == NULL) { - Renderer = gl_CreateInterface(); + if (currentrenderer==1) Renderer = gl_CreateInterface(); + else Renderer = new FSoftwareRenderer; atterm(I_DeleteRenderer); } } @@ -350,7 +357,7 @@ void I_RestoreWindowedPos () extern int NewWidth, NewHeight, NewBits, DisplayBits; -CUSTOM_CVAR (Bool, fullscreen, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG|CVAR_NOINITCALL) +CUSTOM_CVAR (Bool, fullscreen, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG|CVAR_NOINITCALL) { NewWidth = screen->GetWidth(); NewHeight = screen->GetHeight(); diff --git a/src/win32/win32iface.h b/src/win32/win32iface.h index f90d7b47c..13cf603fa 100644 --- a/src/win32/win32iface.h +++ b/src/win32/win32iface.h @@ -56,6 +56,7 @@ extern HANDLE FPSLimitEvent; class D3DTex; class D3DPal; +struct FSoftwareRenderer; class Win32Video : public IVideo { diff --git a/src/win32/win32video.cpp b/src/win32/win32video.cpp index f08b6126f..e22b29cba 100644 --- a/src/win32/win32video.cpp +++ b/src/win32/win32video.cpp @@ -69,6 +69,7 @@ #include "m_argv.h" #include "r_defs.h" #include "v_text.h" +#include "r_swrenderer.h" #include "version.h" #include "win32iface.h"