- changed render interface to resolve textures to materials in the backend.

This is needed to have a unified spot where to resolve textures for both 2D and 3D.
This commit is contained in:
Christoph Oelckers 2020-11-10 09:08:48 +01:00
parent 601680d08e
commit 40358febc1
6 changed files with 45 additions and 32 deletions

View file

@ -4,6 +4,9 @@
#include "intrect.h" #include "intrect.h"
struct event_t; struct event_t;
class FRenderState;
class FGameTexture;
enum EUpscaleFlags;
struct SystemCallbacks struct SystemCallbacks
{ {
@ -27,6 +30,7 @@ struct SystemCallbacks
void (*MenuClosed)(); void (*MenuClosed)();
bool (*CheckMenudefOption)(const char* opt); bool (*CheckMenudefOption)(const char* opt);
void (*ConsoleToggled)(int state); void (*ConsoleToggled)(int state);
bool (*PreBindTexture)(FRenderState* state, FGameTexture*& tex, EUpscaleFlags& flags, int& clampmode, int& translation, int& overrideshader);
}; };
extern SystemCallbacks sysCallbacks; extern SystemCallbacks sysCallbacks;

View file

@ -5,6 +5,7 @@
#include "hw_material.h" #include "hw_material.h"
#include "texmanip.h" #include "texmanip.h"
#include "version.h" #include "version.h"
#include "i_interface.h"
struct FColormap; struct FColormap;
class IVertexBuffer; class IVertexBuffer;
@ -569,6 +570,7 @@ public:
mBias.mChanged = true; mBias.mChanged = true;
} }
private:
void SetMaterial(FMaterial *mat, int clampmode, int translation, int overrideshader) void SetMaterial(FMaterial *mat, int clampmode, int translation, int overrideshader)
{ {
mMaterial.mMaterial = mat; mMaterial.mMaterial = mat;
@ -581,9 +583,13 @@ public:
mStreamData.uDetailParms = { scale.X, scale.Y, 2, 0 }; mStreamData.uDetailParms = { scale.X, scale.Y, 2, 0 };
} }
public:
void SetMaterial(FGameTexture* tex, EUpscaleFlags upscalemask, int scaleflags, int clampmode, int translation, int overrideshader) void SetMaterial(FGameTexture* tex, EUpscaleFlags upscalemask, int scaleflags, int clampmode, int translation, int overrideshader)
{ {
if (shouldUpscale(tex, upscalemask)) scaleflags |= CTF_Upscale; if (sysCallbacks.PreBindTexture && !sysCallbacks.PreBindTexture(this, tex, upscalemask, clampmode, translation, overrideshader))
{
if (shouldUpscale(tex, upscalemask)) scaleflags |= CTF_Upscale;
}
SetMaterial(FMaterial::ValidateTexture(tex, scaleflags), clampmode, translation, overrideshader); SetMaterial(FMaterial::ValidateTexture(tex, scaleflags), clampmode, translation, overrideshader);
} }

View file

@ -78,8 +78,9 @@ bool GLInstance::SetTexture(int picnum, FGameTexture* tex, int paletteid, int sa
SetBasepalTint(texpick.basepalTint); SetBasepalTint(texpick.basepalTint);
auto &mat = renderState.mMaterial; auto &mat = renderState.mMaterial;
int flags = (TextureType == TT_INDEXED) ? CTF_Indexed : 0; mat.mTexture = texpick.texture;
mat.mMaterial = FMaterial::ValidateTexture(texpick.texture, flags); // todo allow scaling mat.uFlags = UF_None;
mat.mScaleFlags = (TextureType == TT_INDEXED) ? CTF_Indexed : 0;
mat.mClampMode = sampler; mat.mClampMode = sampler;
mat.mTranslation = texpick.translation; mat.mTranslation = texpick.translation;
mat.mOverrideShader = -1; mat.mOverrideShader = -1;

View file

@ -58,16 +58,6 @@ static int BufferLock = 0;
TArray<VSMatrix> matrixArray; TArray<VSMatrix> matrixArray;
void Draw2D(F2DDrawer* drawer, FRenderState& state); void Draw2D(F2DDrawer* drawer, FRenderState& state);
FileReader GetResource(const char* fn)
{
auto fr = fileSystem.OpenFileReader(fn);
if (!fr.isOpen())
{
I_Error("Fatal: '%s' not found", fn);
}
return fr;
}
GLInstance GLInterface; GLInstance GLInterface;
GLInstance::GLInstance() GLInstance::GLInstance()
@ -77,10 +67,6 @@ GLInstance::GLInstance()
matrixArray.Push(mat); matrixArray.Push(mat);
} }
//void ImGui_Init_Backend();
//ImGuiContext* im_ctx;
TArray<uint8_t> ttf;
IHardwareTexture *setpalettelayer(int layer, int translation) IHardwareTexture *setpalettelayer(int layer, int translation)
{ {
if (layer == 1) if (layer == 1)
@ -171,7 +157,7 @@ void PolymostRenderState::Apply(FRenderState& state, GLState& oldState)
else else
{ {
state.EnableTexture(gl_texture); state.EnableTexture(gl_texture);
state.SetMaterial(mMaterial.mMaterial, mMaterial.mClampMode, mMaterial.mTranslation, mMaterial.mOverrideShader); state.SetMaterial(mMaterial.mTexture, mMaterial.uFlags, mMaterial.mScaleFlags, mMaterial.mClampMode, mMaterial.mTranslation, mMaterial.mOverrideShader);
} }
state.SetColor(Color[0], Color[1], Color[2], Color[3]); state.SetColor(Color[0], Color[1], Color[2], Color[3]);
@ -262,7 +248,6 @@ void PolymostRenderState::Apply(FRenderState& state, GLState& oldState)
FVector4 blendcol(0, 0, 0, 0); FVector4 blendcol(0, 0, 0, 0);
int flags = 0; int flags = 0;
if (Flags & RF_ShadeInterpolate) flags |= 16384; // hijack a free bit in here.
if (fullscreenTint != 0xffffff) flags |= 16; if (fullscreenTint != 0xffffff) flags |= 16;
if (hictint_flags != -1) if (hictint_flags != -1)
{ {
@ -274,7 +259,7 @@ void PolymostRenderState::Apply(FRenderState& state, GLState& oldState)
modcol.Z *= hictint.b / 64.f; modcol.Z *= hictint.b / 64.f;
} }
if (hictint_flags & TINTF_GRAYSCALE) if (hictint_flags & TINTF_GRAYSCALE)
modcol.W = 1.f; modcol.W = 1.f;
if (hictint_flags & TINTF_INVERT) if (hictint_flags & TINTF_INVERT)
flags |= TextureManipulation::InvertBit; flags |= TextureManipulation::InvertBit;
@ -286,6 +271,7 @@ void PolymostRenderState::Apply(FRenderState& state, GLState& oldState)
} }
} }
addcol.W = flags; addcol.W = flags;
if (Flags & RF_ShadeInterpolate) addcol.W += 16384; // hijack a free bit in here.
state.SetTextureColors(&modcol.X, &addcol.X, &blendcol.X); state.SetTextureColors(&modcol.X, &addcol.X, &blendcol.X);
if (matrixIndex[Matrix_Model] != -1) if (matrixIndex[Matrix_Model] != -1)

View file

@ -269,22 +269,16 @@ public:
SetColor(r * (1 / 255.f), g * (1 / 255.f), b * (1 / 255.f), a * (1 / 255.f)); SetColor(r * (1 / 255.f), g * (1 / 255.f), b * (1 / 255.f), a * (1 / 255.f));
} }
void SetMaterial(FMaterial* mat, int clampmode, int translation, int overrideshader) void SetMaterial(FGameTexture* tex, EUpscaleFlags upscalemask, int scaleflags, int clampmode, int translation, int overrideshader)
{ {
assert(mat); assert(tex);
renderState.mMaterial.mMaterial = mat; renderState.mMaterial.mTexture = tex;
renderState.mMaterial.uFlags = upscalemask;
renderState.mMaterial.mScaleFlags = scaleflags;
renderState.mMaterial.mClampMode = clampmode; renderState.mMaterial.mClampMode = clampmode;
renderState.mMaterial.mTranslation = translation; renderState.mMaterial.mTranslation = translation;
renderState.mMaterial.mOverrideShader = overrideshader; renderState.mMaterial.mOverrideShader = overrideshader;
renderState.mMaterial.mChanged = true; renderState.mMaterial.mChanged = true;
//mTextureModeFlags = mat->GetLayerFlags();
}
void SetMaterial(FGameTexture* tex, EUpscaleFlags upscalemask, int scaleflags, int clampmode, int translation, int overrideshader)
{
assert(tex);
if (shouldUpscale(tex, upscalemask)) scaleflags |= CTF_Upscale;
SetMaterial(FMaterial::ValidateTexture(tex, scaleflags), clampmode, translation, overrideshader);
} }
void UseColorOnly(bool yes) void UseColorOnly(bool yes)

View file

@ -43,6 +43,28 @@ enum PRSFlags
STF_SCISSORSET = 8192, STF_SCISSORSET = 8192,
}; };
struct PolymostTextureState
{
FGameTexture* mTexture = nullptr;
EUpscaleFlags uFlags;
int mScaleFlags;
int mClampMode;
int mTranslation;
int mOverrideShader;
bool mChanged;
void Reset()
{
mTexture = nullptr;
uFlags = UF_None;
mScaleFlags = 0;
mTranslation = 0;
mClampMode = CLAMP_NONE;
mOverrideShader = -1;
mChanged = false;
}
};
struct PolymostRenderState struct PolymostRenderState
{ {
int vindex, vcount, primtype; int vindex, vcount, primtype;
@ -59,7 +81,7 @@ struct PolymostRenderState
PalEntry fullscreenTint = 0xffffff, hictint = 0xffffff, hictint_overlay = 0xffffff; PalEntry fullscreenTint = 0xffffff, hictint = 0xffffff, hictint_overlay = 0xffffff;
int hictint_flags = -1; int hictint_flags = -1;
FDepthBiasState mBias{ }; FDepthBiasState mBias{ };
FMaterialState mMaterial; PolymostTextureState mMaterial;
int StateFlags = STF_COLORMASK|STF_DEPTHMASK; int StateFlags = STF_COLORMASK|STF_DEPTHMASK;
FRenderStyle Style{}; FRenderStyle Style{};