- moved FRenderState to 'common' and removed some game-dependent parts from it.

This commit is contained in:
Christoph Oelckers 2020-04-25 23:29:38 +02:00
parent 21f32834b2
commit 0c63f5c832
24 changed files with 94 additions and 68 deletions

View file

@ -2,11 +2,9 @@
#include "v_palette.h"
#include "vectors.h"
#include "g_levellocals.h"
#include "hw_drawstructs.h"
#include "hw_drawlist.h"
#include "matrix.h"
#include "hw_material.h"
#include "texmanip.h"
struct FColormap;
class IVertexBuffer;
@ -239,9 +237,9 @@ protected:
EPassType mPassType = NORMAL_PASS;
uint64_t firstFrame = 0;
public:
uint64_t firstFrame = 0;
VSMatrix mModelMatrix;
VSMatrix mTextureMatrix;
@ -432,28 +430,22 @@ public:
mLightParms[3] = -1.f;
}
void SetGlowPlanes(const secplane_t &top, const secplane_t &bottom)
void SetGlowPlanes(const FVector4 &tp, const FVector4& bp)
{
auto &tn = top.Normal();
auto &bn = bottom.Normal();
mStreamData.uGlowTopPlane = { (float)tn.X, (float)tn.Y, (float)top.negiC, (float)top.fD() };
mStreamData.uGlowBottomPlane = { (float)bn.X, (float)bn.Y, (float)bottom.negiC, (float)bottom.fD() };
mStreamData.uGlowTopPlane = tp;
mStreamData.uGlowBottomPlane = bp;
}
void SetGradientPlanes(const secplane_t &top, const secplane_t &bottom)
void SetGradientPlanes(const FVector4& tp, const FVector4& bp)
{
auto &tn = top.Normal();
auto &bn = bottom.Normal();
mStreamData.uGradientTopPlane = { (float)tn.X, (float)tn.Y, (float)top.negiC, (float)top.fD() };
mStreamData.uGradientBottomPlane = { (float)bn.X, (float)bn.Y, (float)bottom.negiC, (float)bottom.fD() };
mStreamData.uGradientTopPlane = tp;
mStreamData.uGradientBottomPlane = bp;
}
void SetSplitPlanes(const secplane_t &top, const secplane_t &bottom)
void SetSplitPlanes(const FVector4& tp, const FVector4& bp)
{
auto &tn = top.Normal();
auto &bn = bottom.Normal();
mStreamData.uSplitTopPlane = { (float)tn.X, (float)tn.Y, (float)top.negiC, (float)top.fD() };
mStreamData.uSplitBottomPlane = { (float)bn.X, (float)bn.Y, (float)bottom.negiC, (float)bottom.fD() };
mStreamData.uSplitTopPlane = tp;
mStreamData.uSplitBottomPlane = bp;
}
void SetDetailParms(float xscale, float yscale, float bias)
@ -522,14 +514,6 @@ public:
else mAlphaThreshold = thresh - 0.001f;
}
void SetPlaneTextureRotation(HWSectorPlane *plane, FGameTexture *texture)
{
if (hw_SetPlaneTextureRotation(plane, texture, mTextureMatrix))
{
EnableTextureMatrix(true);
}
}
void SetLightIndex(int index)
{
mLightIndex = index;
@ -647,8 +631,6 @@ public:
return mPassType;
}
void CheckTimer(uint64_t ShaderStartTime);
// API-dependent render interface
// Draw commands

View file

@ -27,7 +27,7 @@
#include "gl_interface.h"
#include "matrix.h"
#include "hwrenderer/scene//hw_drawstructs.h"
#include "hwrenderer/scene//hw_renderstate.h"
#include "hw_renderstate.h"
#include "hw_material.h"
#include "c_cvars.h"
#include "r_defs.h"

View file

@ -41,7 +41,7 @@
#include "v_video.h"
#include "cmdlib.h"
#include "hwrenderer/data/buffers.h"
#include "hwrenderer/scene/hw_renderstate.h"
#include "hw_renderstate.h"
//==========================================================================
//

View file

@ -27,7 +27,7 @@
#include "hwrenderer/data/shaderuniforms.h"
#include "hwrenderer/scene/hw_viewpointuniforms.h"
#include "hwrenderer/scene/hw_renderstate.h"
#include "hw_renderstate.h"
#include "hw_viewpointbuffer.h"
static const int INITIAL_BUFFER_SIZE = 100; // 100 viewpoints per frame should nearly always be enough

View file

@ -243,6 +243,15 @@ void WriteSavePic(player_t* player, FileWriter* file, int width, int height)
//
//===========================================================================
static void CheckTimer(FRenderState &state, uint64_t ShaderStartTime)
{
// if firstFrame is not yet initialized, initialize it to current time
// if we're going to overflow a float (after ~4.6 hours, or 24 bits), re-init to regain precision
if ((state.firstFrame == 0) || (screen->FrameTime - state.firstFrame >= 1 << 24) || ShaderStartTime >= state.firstFrame)
state.firstFrame = screen->FrameTime;
}
sector_t* RenderView(player_t* player)
{
auto RenderState = screen->RenderState();
@ -281,7 +290,7 @@ sector_t* RenderView(player_t* player)
// Shader start time does not need to be handled per level. Just use the one from the camera to render from.
if (player->camera)
RenderState->CheckTimer(player->camera->Level->ShaderStartTime);
CheckTimer(*RenderState, player->camera->Level->ShaderStartTime);
// prepare all camera textures that have been used in the last frame.
// This must be done for all levels, not just the primary one!
for (auto Level : AllLevels())

View file

@ -39,7 +39,7 @@
#include "hwrenderer/data/buffers.h"
#include "hwrenderer/data/flatvertices.h"
#include "hwrenderer/scene/hw_drawinfo.h"
#include "hwrenderer/scene/hw_renderstate.h"
#include "hw_renderstate.h"
#include "hwrenderer/scene/hw_portal.h"
#include "hw_models.h"

View file

@ -108,7 +108,7 @@ void HWDecal::DrawDecal(HWDrawInfo *di, FRenderState &state)
di->SetColor(state, thisll, rellight, di->isFullbrightScene(), thiscm, alpha);
if (di->Level->flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING) thiscm.Decolorize();
di->SetFog(state, thisll, rellight, di->isFullbrightScene(), &thiscm, false);
state.SetSplitPlanes(lightlist[k].plane, lowplane);
SetSplitPlanes(state, lightlist[k].plane, lowplane);
state.Draw(DT_TriangleStrip, vertindex, 4);
}

View file

@ -435,3 +435,4 @@ struct FDynLightData;
struct FDynamicLight;
bool GetLight(FDynLightData& dld, int group, Plane& p, FDynamicLight* light, bool checkside);
void AddLightToList(FDynLightData &dld, int group, FDynamicLight* light, bool forceAttenuate);
void SetSplitPlanes(FRenderState& state, const secplane_t& top, const secplane_t& bottom);

View file

@ -91,6 +91,15 @@ bool hw_SetPlaneTextureRotation(const HWSectorPlane * secplane, FGameTexture * g
return false;
}
void SetPlaneTextureRotation(FRenderState &state, HWSectorPlane* plane, FGameTexture* texture)
{
if (hw_SetPlaneTextureRotation(plane, texture, state.mTextureMatrix))
{
state.EnableTextureMatrix(true);
}
}
//==========================================================================
//
@ -326,7 +335,7 @@ void HWFlat::DrawFlat(HWDrawInfo *di, FRenderState &state, bool translucent)
if (sector->special != GLSector_Skybox)
{
state.SetMaterial(texture, UF_Texture, 0, CLAMP_NONE, 0, -1);
state.SetPlaneTextureRotation(&plane, texture);
SetPlaneTextureRotation(state, &plane, texture);
DrawSubsectors(di, state);
state.EnableTextureMatrix(false);
}
@ -354,7 +363,7 @@ void HWFlat::DrawFlat(HWDrawInfo *di, FRenderState &state, bool translucent)
if (!texture->GetTranslucency()) state.AlphaFunc(Alpha_GEqual, gl_mask_threshold);
else state.AlphaFunc(Alpha_GEqual, 0.f);
state.SetMaterial(texture, UF_Texture, 0, CLAMP_NONE, 0, -1);
state.SetPlaneTextureRotation(&plane, texture);
SetPlaneTextureRotation(state, &plane, texture);
DrawSubsectors(di, state);
state.EnableTextureMatrix(false);
}

View file

@ -41,6 +41,8 @@
EXTERN_CVAR(Int, r_mirror_recursions)
EXTERN_CVAR(Bool, gl_portals)
void SetPlaneTextureRotation(FRenderState& state, HWSectorPlane* plane, FGameTexture* texture);
//-----------------------------------------------------------------------------
//
// StartFrame
@ -979,7 +981,7 @@ void HWHorizonPortal::DrawContents(HWDrawInfo *di, FRenderState &state)
state.SetMaterial(texture, UF_Texture, 0, CLAMP_NONE, 0, -1);
state.SetObjectColor(origin->specialcolor);
state.SetPlaneTextureRotation(sp, texture);
SetPlaneTextureRotation(state, sp, texture);
state.AlphaFunc(Alpha_GEqual, 0.f);
state.SetRenderStyle(STYLE_Source);

View file

@ -2,6 +2,7 @@
#include "tarray.h"
#include "r_utility.h"
#include "r_sections.h"
#include "actor.h"
#include "hwrenderer/scene/hw_drawinfo.h"
#include "hwrenderer/scene/hw_drawstructs.h"

View file

@ -25,6 +25,7 @@
**
*/
#include "g_levellocals.h"
#include "hw_renderstate.h"
#include "hw_drawstructs.h"
#include "hw_portal.h"
@ -157,11 +158,3 @@ void HWDrawInfo::SetFog(FRenderState &state, int lightlevel, int rellight, bool
}
}
void FRenderState::CheckTimer(uint64_t ShaderStartTime)
{
// if firstFrame is not yet initialized, initialize it to current time
// if we're going to overflow a float (after ~4.6 hours, or 24 bits), re-init to regain precision
if ((firstFrame == 0) || (screen->FrameTime - firstFrame >= 1 << 24) || ShaderStartTime >= firstFrame)
firstFrame = screen->FrameTime;
}

View file

@ -28,7 +28,7 @@
#include "g_levellocals.h"
#include "hwrenderer/scene/hw_skydome.h"
#include "hwrenderer/scene/hw_portal.h"
#include "hwrenderer/scene/hw_renderstate.h"
#include "hw_renderstate.h"
#include "skyboxtexture.h"

View file

@ -237,11 +237,11 @@ void HWSprite::DrawSprite(HWDrawInfo *di, FRenderState &state, bool translucent)
{
di->SetFog(state, thislight, rel, di->isFullbrightScene(), &thiscm, additivefog);
}
state.SetSplitPlanes(*topplane, *lowplane);
SetSplitPlanes(state, *topplane, *lowplane);
}
else if (clipping)
{
state.SetSplitPlanes(topp, bottomp);
SetSplitPlanes(state, topp, bottomp);
}
if (!modelframe)

View file

@ -44,6 +44,35 @@
#include "hw_renderstate.h"
#include "hw_skydome.h"
void SetGlowPlanes(FRenderState &state, const secplane_t& top, const secplane_t& bottom)
{
auto& tn = top.Normal();
auto& bn = bottom.Normal();
FVector4 tp = { (float)tn.X, (float)tn.Y, (float)top.negiC, (float)top.fD() };
FVector4 bp = { (float)bn.X, (float)bn.Y, (float)bottom.negiC, (float)bottom.fD() };
state.SetGlowPlanes(tp, bp);
}
void SetGradientPlanes(FRenderState& state, const secplane_t& top, const secplane_t& bottom)
{
auto& tn = top.Normal();
auto& bn = bottom.Normal();
FVector4 tp = { (float)tn.X, (float)tn.Y, (float)top.negiC, (float)top.fD() };
FVector4 bp = { (float)bn.X, (float)bn.Y, (float)bottom.negiC, (float)bottom.fD() };
state.SetGradientPlanes(tp, bp);
}
void SetSplitPlanes(FRenderState& state, const secplane_t& top, const secplane_t& bottom)
{
auto& tn = top.Normal();
auto& bn = bottom.Normal();
FVector4 tp = { (float)tn.X, (float)tn.Y, (float)top.negiC, (float)top.fD() };
FVector4 bp = { (float)bn.X, (float)bn.Y, (float)bottom.negiC, (float)bottom.fD() };
state.SetSplitPlanes(tp, bp);
}
//==========================================================================
//
// General purpose wall rendering function
@ -155,7 +184,7 @@ void HWWall::RenderTexturedWall(HWDrawInfo *di, FRenderState &state, int rflags)
{
state.EnableGlow(true);
state.SetGlowParams(topglowcolor, bottomglowcolor);
state.SetGlowPlanes(frontsector->ceilingplane, frontsector->floorplane);
SetGlowPlanes(state, frontsector->ceilingplane, frontsector->floorplane);
}
state.SetMaterial(texture, UF_Texture, 0, flags & 3, 0, -1);
@ -191,20 +220,20 @@ void HWWall::RenderTexturedWall(HWDrawInfo *di, FRenderState &state, int rflags)
{
if (tierndx == side_t::top)
{
state.SetGradientPlanes(frontsector->ceilingplane, backsector->ceilingplane);
SetGradientPlanes(state, frontsector->ceilingplane, backsector->ceilingplane);
}
else if (tierndx == side_t::mid)
{
state.SetGradientPlanes(backsector->ceilingplane, backsector->floorplane);
SetGradientPlanes(state, backsector->ceilingplane, backsector->floorplane);
}
else // side_t::bottom:
{
state.SetGradientPlanes(backsector->floorplane, frontsector->floorplane);
SetGradientPlanes(state, backsector->floorplane, frontsector->floorplane);
}
}
else
{
state.SetGradientPlanes(frontsector->ceilingplane, frontsector->floorplane);
SetGradientPlanes(state, frontsector->ceilingplane, frontsector->floorplane);
}
}
}
@ -237,7 +266,7 @@ void HWWall::RenderTexturedWall(HWDrawInfo *di, FRenderState &state, int rflags)
CopyFrom3DLight(thiscm, &(*lightlist)[i]);
di->SetColor(state, thisll, rel, false, thiscm, absalpha);
if (type != RENDERWALL_M2SNF) di->SetFog(state, thisll, rel, false, &thiscm, RenderStyle == STYLE_Add);
state.SetSplitPlanes((*lightlist)[i].plane, lowplane);
SetSplitPlanes(state, (*lightlist)[i].plane, lowplane);
RenderWall(di, state, rflags);
}
if (low1 <= zbottom[0] && low2 <= zbottom[1]) break;

View file

@ -34,7 +34,7 @@
#include "hwrenderer/data/hw_viewpointbuffer.h"
#include "hwrenderer/utility/hw_clock.h"
#include "hwrenderer/utility/hw_cvars.h"
#include "hwrenderer/scene/hw_renderstate.h"
#include "hw_renderstate.h"
#include "r_videoscale.h"

View file

@ -25,7 +25,7 @@
#include "r_data/colormaps.h"
#include "hw_material.h"
#include "hwrenderer/utility/hw_cvars.h"
#include "hwrenderer/scene/hw_renderstate.h"
#include "hw_renderstate.h"
#include "poly_framebuffer.h"
#include "poly_hwtexture.h"

View file

@ -7,7 +7,7 @@
#include "name.h"
#include "hwrenderer/scene/hw_drawstructs.h"
#include "hwrenderer/scene/hw_renderstate.h"
#include "hw_renderstate.h"
#include "hw_material.h"
struct HWViewpointUniforms;

View file

@ -2,7 +2,7 @@
#pragma once
#include "hwrenderer/scene/hw_viewpointuniforms.h"
#include "hwrenderer/scene/hw_renderstate.h"
#include "hw_renderstate.h"
#ifndef NO_SSE
#include <xmmintrin.h>

View file

@ -421,8 +421,8 @@ static void WriteVaryingWarp1(float posU, float posV, float stepU, float stepV,
float u = posU * w[x];
float v = posV * w[x];
v += g_sin(pi2 * (u + timer)) * 0.1f;
u += g_sin(pi2 * (v + timer)) * 0.1f;
v += (float)g_sin(pi2 * (u + timer)) * 0.1f;
u += (float)g_sin(pi2 * (v + timer)) * 0.1f;
u = u - std::floor(u);
v = v - std::floor(v);
@ -448,8 +448,8 @@ static void WriteVaryingWarp2(float posU, float posV, float stepU, float stepV,
float u = posU * w[x];
float v = posV * w[x];
v += (0.5f + g_sin(pi2 * (v + timer * 0.61f + 900.f/8192.f)) + g_sin(pi2 * (u * 2.0f + timer * 0.36f + 300.0f/8192.0f))) * 0.025f;
u += (0.5f + g_sin(pi2 * (v + timer * 0.49f + 700.f/8192.f)) + g_sin(pi2 * (u * 2.0f + timer * 0.49f + 1200.0f/8192.0f))) * 0.025f;
v += (0.5f + (float)g_sin(pi2 * (v + timer * 0.61f + 900.f/8192.f)) + (float)g_sin(pi2 * (u * 2.0f + timer * 0.36f + 300.0f/8192.0f))) * 0.025f;
u += (0.5f + (float)g_sin(pi2 * (v + timer * 0.49f + 700.f/8192.f)) + (float)g_sin(pi2 * (u * 2.0f + timer * 0.49f + 1200.0f/8192.0f))) * 0.025f;
u = u - std::floor(u);
v = v - std::floor(v);

View file

@ -4,7 +4,7 @@
#include "vulkan/system/vk_objects.h"
#include "renderstyle.h"
#include "hwrenderer/data/buffers.h"
#include "hwrenderer/scene/hw_renderstate.h"
#include "hw_renderstate.h"
#include <string.h>
#include <map>

View file

@ -9,7 +9,7 @@
#include "name.h"
#include "hwrenderer/scene/hw_drawstructs.h"
#include "hwrenderer/scene/hw_renderstate.h"
#include "hw_renderstate.h"
#include "hw_material.h"
class VkRenderPassSetup;

View file

@ -6,7 +6,7 @@
#include "vectors.h"
#include "matrix.h"
#include "name.h"
#include "hwrenderer/scene/hw_renderstate.h"
#include "hw_renderstate.h"
#define SHADER_MIN_REQUIRED_TEXTURE_LAYERS 8

View file

@ -25,7 +25,7 @@
#include "r_data/colormaps.h"
#include "hw_material.h"
#include "hwrenderer/utility/hw_cvars.h"
#include "hwrenderer/scene/hw_renderstate.h"
#include "hw_renderstate.h"
#include "vulkan/system/vk_objects.h"
#include "vulkan/system/vk_builders.h"
#include "vulkan/system/vk_framebuffer.h"