Skip to content

Commit

Permalink
Added shader:EnableColorWrites/SetTexCoordCount
Browse files Browse the repository at this point in the history
fix  #11
  • Loading branch information
devonium committed Jun 12, 2023
1 parent 3026cdc commit ea38290
Show file tree
Hide file tree
Showing 4 changed files with 106 additions and 56 deletions.
1 change: 1 addition & 0 deletions source/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ void luaL_closestate_detour(lua_State* L)
GarrysMod::Lua::ILuaBase* LUA = g_pClientLua->luabase;
LUA->SetState(g_pClientLua);
CL_Deinit(LUA);
g_pClientLua = NULL;
}
luaL_closestate_hk.GetTrampoline<luaL_closestate>()(L);
}
Expand Down
80 changes: 50 additions & 30 deletions source/shaderlib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -545,10 +545,12 @@ namespace ShaderLib
constant->IsValid = 2;
constant->IsStandard = false;
setup:
constant->RowsCount = rowsCount;
constant->Type = ShaderConstantF::Param;
constant->Index = index;
if (constant->Param != paramindex) { constant->IsValid = 2; }
constant->Param = paramindex;

}

void AttemptToSetError(ILuaBase* LUA)
Expand Down Expand Up @@ -827,6 +829,13 @@ namespace ShaderLib
u->Shader->SupportsFlashlight = LUA->GetBool(2);
return 0;
}

LUA_LIB_FUNCTION(shader_methods, EnableColorWrites)
{
ShaderUData* u = GetUShader(LUA);
u->Shader->bColorWrites = LUA->GetBool(2);
return 0;
}

LUA_LIB_FUNCTION(shader_methods, EnableStencil)
{
Expand Down Expand Up @@ -889,9 +898,16 @@ namespace ShaderLib
ShaderUData* u = GetUShader(LUA);
u->Shader->StencilWriteMask = LUA->CheckNumber(2);
return 0;
}

LUA_LIB_FUNCTION(shader_methods, SetTexCoordCount)
{
ShaderUData* u = GetUShader(LUA);
u->Shader->nTexCoordCount = LUA->CheckNumber(2);
return 0;
}

LUA_LIB_FUNCTION(shader_methods, SetRenderTarget)
void ShaderLib_SetRT(ILuaBase* LUA, bool refl = false)
{
ShaderUData* u = GetUShader(LUA);
int ind = LUA->CheckNumber(2);
Expand All @@ -900,13 +916,38 @@ namespace ShaderLib
LUA->ThrowError("rt index out of valid range [0-3]");
}

ITexture** rts = refl ? u->Shader->rts_refl : u->Shader->rts;

const char* name = LUA->GetString(3);
if (!name)
{
if (rts[ind])
{
rts[ind]->DecrementReferenceCount();
rts[ind] = NULL;
}
return;
}
auto tex = g_pMaterialSystem->FindTexture(name, TEXTURE_GROUP_RENDER_TARGET);

if (!tex || tex->IsError()) { LUA->ThrowError("provided texture doens't exist"); }
if (!tex->IsRenderTarget()) { LUA->ThrowError("provided texture is not a render target"); }

u->Shader->rts[ind] = tex;
if (tex == rts[ind]) { return; }
rts[ind] = tex;
tex->IncrementReferenceCount();
return;
}

LUA_LIB_FUNCTION(shader_methods, SetRenderTarget)
{
ShaderLib_SetRT(LUA);
return 0;
}

LUA_LIB_FUNCTION(shader_methods, SetReflectionRenderTarget)
{
ShaderLib_SetRT(LUA, true);
return 0;
}

Expand All @@ -916,7 +957,7 @@ namespace ShaderLib
#define RES_CV(name) name->SetValue(name##_OV);
#define SET_CV(name) name##_OV = name->GetBool(); name->SetValue(false);
MK_CV(mat_drawwater)
MK_CV(r_drawtranslucentworld)
MK_CV(r_drawtranslucentworld);


LUA_LIB_FUNCTION(shaderlib, BeginDepthPass)
Expand Down Expand Up @@ -1027,18 +1068,6 @@ namespace ShaderLib
return;
}

Define_method_Hook(void, RT_ClearColor4ub, void*, unsigned char r, unsigned char g, unsigned char b, unsigned char a)
{
if (bDepthPass)
{
return;
}

RT_ClearColor4ub_trampoline()(_this, r, g, b, a);
}



IMaterial* transpMat = NULL;
IMaterial* depthMat = NULL;

Expand Down Expand Up @@ -1221,7 +1250,7 @@ namespace ShaderLib

void* DepthPass = ScanSign(clientdll, sign, sizeof(sign) - 1);
if (!DepthPass) { ShaderLibError("CBaseWorldView::SSAO_DepthPass == NULL\n"); return 0; }
Setup_Hook(CBaseWorldView_SSAO_DepthPass, DepthPass)
Setup_Hook(CBaseWorldView_SSAO_DepthPass, DepthPass);
}

{
Expand All @@ -1233,19 +1262,9 @@ namespace ShaderLib

void* CSkyboxView_Draw = ScanSign(clientdll, sign, sizeof(sign) - 1);
if (!CSkyboxView_Draw) { ShaderLibError("CSkyboxView_Draw == NULL\n"); return 0; }
Setup_Hook(CSkyboxView_Draw, CSkyboxView_Draw)
Setup_Hook(CSkyboxView_Draw, CSkyboxView_Draw);
}

{
static const char sign[] =
HOOK_SIGN_x32("55 8B EC 8B ? ? ? ? ? 8B 01 5D FF A0 98 01 00 00")
HOOK_SIGN_x64("55 8B EC 8B ? ? ? ? ? 8B 01 5D FF A0 98 01 00 00");

//RT_ClearColor4ub_decl RT_ClearColor4ub = (RT_ClearColor4ub_decl)ScanSign(materialsystemdll, sign, sizeof(sign) - 1);
//if (!RT_ClearColor4ub) { ShaderLibError("RT_ClearColor4ub == NULL\n"); return 0; }
//
//Setup_Hook(RT_ClearColor4ub, RT_ClearColor4ub)
}

{
static const char sign[] =
Expand All @@ -1255,12 +1274,13 @@ namespace ShaderLib

void* Bind = ScanSign(materialsystemdll, sign, sizeof(sign) - 1);
if (!Bind) { ShaderLibError("CMatRenderContextBase::Bind == NULL\n"); return 0; }
Setup_Hook(CMatRenderContextBase_Bind, Bind)
Setup_Hook(CMatRenderContextBase_Bind, Bind);
}

Setup_Hook(CShaderManager_PurgeUnusedVertexAndPixelShaders, GetVTable(g_pShaderManager)[15])
Setup_Hook(CShaderSystem_InitShaderParameters, GetVTable(g_pCShaderSystem)[14])

Setup_Hook(CShaderManager_PurgeUnusedVertexAndPixelShaders, GetVTable(g_pShaderManager)[15]);
Setup_Hook(CShaderSystem_InitShaderParameters, GetVTable(g_pCShaderSystem)[14]);

g_pShaderLibDLLIndex = g_pCShaderSystem->m_ShaderDLLs.AddToTail();
g_pShaderLibDLL = &g_pCShaderSystem->m_ShaderDLLs[g_pShaderLibDLLIndex];
g_pShaderLibDLL->m_pFileName = strdup("egsm_shaders.dll");
Expand Down
79 changes: 54 additions & 25 deletions source/shaderlib.h
Original file line number Diff line number Diff line change
Expand Up @@ -288,20 +288,15 @@ namespace ShaderLib
Float = 1,
Bool = 2,
Param = 3,
Param_TextureTransform = 4,
};
char Index = 0;
int Num : 4;
ShaderConstantType Type : 4;
int Index = 0;
int Num;
ShaderConstantType Type;
float Vals[4];
float _[13];
};

enum RetValueType
{
NONE,
FLOAT,
BOOL
};

#define GENStandardConstantType(_) _(EYE_POS) _(CURTIME) _(LIGHT_INFO) _(AMBIENT_CUBE) _(FOG_PARAMS) _(SHADER_CONTROLS) _(DIFFUSE_MODULATION)
#define GENStandardConstantTypeEnum(v) v,
Expand All @@ -313,8 +308,8 @@ namespace ShaderLib
__Total__,
};
int Index = 0;
int RowsCount : 4;
ShaderConstantF::ShaderConstantType Type : 4;
int RowsCount = 4;
ShaderConstantF::ShaderConstantType Type;
int ParamType = 0;
int Param = 0;
int IsValid = 2;
Expand All @@ -324,15 +319,22 @@ namespace ShaderLib

struct ShaderConstantM
{
char Index = 0;
ShaderConstantF::ShaderConstantType Type : 4;
int Index = 0;
int RowsCount = 0;
float Vals[16];
ShaderConstantF::ShaderConstantType Type;
float Vals[17];
};

LightState_t lightState;
VMatrix viewMatrix, projectionMatrix, viewProjectionMatrix, inverseViewProjectionMatrix;

enum RetValueType
{
NONE,
FLOAT,
BOOL
};

RetValueType StdToValue(IShaderDynamicAPI* pShaderAPI, ShaderConstantP* param, IMaterialVar** params, int vsh)
{
CMatRenderContextPtr pRenderContext(g_pMaterialSystem);
Expand Down Expand Up @@ -394,6 +396,7 @@ namespace ShaderLib
ShaderPolyMode_t PolyMode = SHADER_POLYMODE_FILL;

bool OverrideBlending = false;
bool bColorWrites = true;
ShaderBlendFactor_t BlendSrc = SHADER_BLEND_SRC_ALPHA;
ShaderBlendFactor_t BlendDst = SHADER_BLEND_ONE_MINUS_SRC_ALPHA;

Expand All @@ -407,13 +410,14 @@ namespace ShaderLib
uint32 StencilWriteMask = 0;

ITexture* rts[4] = { 0, 0, 0, 0 };
ITexture* rts_refl[4] = { 0, 0, 0, 0 };

int nTexCoordCount = 1;

void OnDrawElements(IMaterialVar** params, IShaderShadow* pShaderShadow, IShaderDynamicAPI* pShaderAPI, VertexCompressionType_t vertexCompression, CBasePerMaterialContextData** pContextDataPtr)
{
if (!VShader || !PShader) { Draw(false); return; }
bool bHasFlashlight = SupportsFlashlight && UsingFlashlight(params);


bool bHasBaseTexture = params[BASETEXTURE]->IsTexture();
bool bIsAlphaTested = IS_FLAG_SET(MATERIAL_VAR_ALPHATEST) != 0;

Expand All @@ -423,7 +427,8 @@ namespace ShaderLib
if (IsSnapshotting())
{
pShaderShadow->EnableAlphaTest(bIsAlphaTested);



if (bHasFlashlight)
{
if (bHasBaseTexture)
Expand Down Expand Up @@ -472,16 +477,16 @@ namespace ShaderLib
}

pShaderShadow->EnableSRGBWrite(true);

unsigned int flags = VERTEX_POSITION | VERTEX_NORMAL | VERTEX_FORMAT_COMPRESSED;

int nTexCoordCount = 1;
int userDataSize = 4;

pShaderShadow->VertexShaderVertexFormat(flags, nTexCoordCount, NULL, userDataSize);

pShaderShadow->SetVertexShader(VShader, INT_MIN);
pShaderShadow->SetPixelShader(PShader, INT_MIN);

if (bHasFlashlight)
{
FogToBlack();
Expand All @@ -493,6 +498,7 @@ namespace ShaderLib

// HACK HACK HACK - enable alpha writes all the time so that we have them for underwater stuff
pShaderShadow->EnableAlphaWrites(bFullyOpaque);
pShaderShadow->EnableColorWrites(bColorWrites);
}
else // not snapshotting -- begin dynamic state
{
Expand Down Expand Up @@ -542,7 +548,7 @@ namespace ShaderLib

pShaderAPI->SetVertexShaderIndex((5 * (numBones > 0) + lightState.m_nNumLights));
pShaderAPI->SetPixelShaderIndex((5 * (bHasFlashlight)) + lightState.m_nNumLights);

if (bHasFlashlight)
{
VMatrix worldToTexture;
Expand Down Expand Up @@ -665,6 +671,7 @@ namespace ShaderLib
for (int i = 0; i < VConstants.Count(); i++)
{
ShaderConstantF* constant = VConstants.Element(i);

if (constant->Type == constant->Float)
{
pShaderAPI->SetVertexShaderConstant(constant->Index, constant->Vals);
Expand Down Expand Up @@ -719,8 +726,15 @@ namespace ShaderLib
}
else if (type == MATERIAL_VAR_TYPE_MATRIX)
{
VMatrix f = param->GetMatrixValue();
pShaderAPI->SetPixelShaderConstant(constant->Index, f.Base(), constantP->RowsCount);
VMatrix mat = param->GetMatrixValue();

Vector4D transformation[2];

transformation[0].Init(mat[0][0], mat[0][1], mat[0][2], mat[0][3]);
transformation[1].Init(mat[1][0], mat[1][1], mat[1][2], mat[1][3]);


pShaderAPI->SetPixelShaderConstant(constant->Index, transformation[0].Base(), constantP->RowsCount);
}
}
}
Expand All @@ -736,6 +750,7 @@ namespace ShaderLib
isWaterPass = strcmp(rt->GetName(), "_rt_waterreflection") == 0;
}


if (!IsSnapshotting())
{
pRenderContext->SetStencilEnable(IsStencilEnabled);
Expand All @@ -748,7 +763,14 @@ namespace ShaderLib
pRenderContext->SetStencilWriteMask(StencilWriteMask);
pRenderContext->CullMode(CullMode);

if (!isWaterPass)
if (isWaterPass)
{
if (rts_refl[0]) { pMatRenderContext->SetRenderTargetEx(0, rts_refl[0]); }
if (rts_refl[1]) { pMatRenderContext->SetRenderTargetEx(1, rts_refl[1]); }
if (rts_refl[2]) { pMatRenderContext->SetRenderTargetEx(2, rts_refl[2]); }
if (rts_refl[3]) { pMatRenderContext->SetRenderTargetEx(3, rts_refl[3]); }
}
else
{
if (rts[0]) { pMatRenderContext->SetRenderTargetEx(0, rts[0]); }
if (rts[1]) { pMatRenderContext->SetRenderTargetEx(1, rts[1]); }
Expand All @@ -761,7 +783,14 @@ namespace ShaderLib
b_isEgsmShader = false;
if (!IsSnapshotting())
{
if (!isWaterPass)
if (isWaterPass)
{
if (rts_refl[0]) { pMatRenderContext->SetRenderTargetEx(0, NULL); }
if (rts_refl[1]) { pMatRenderContext->SetRenderTargetEx(1, NULL); }
if (rts_refl[2]) { pMatRenderContext->SetRenderTargetEx(2, NULL); }
if (rts_refl[3]) { pMatRenderContext->SetRenderTargetEx(3, NULL); }
}
else
{
if (rts[0]) { pMatRenderContext->SetRenderTargetEx(0, NULL); }
if (rts[1]) { pMatRenderContext->SetRenderTargetEx(1, NULL); }
Expand Down
2 changes: 1 addition & 1 deletion source/version.h
Original file line number Diff line number Diff line change
@@ -1 +1 @@
#define EGSM_VERSION 9
#define EGSM_VERSION 10

0 comments on commit ea38290

Please sign in to comment.