diff --git a/include_files/depthpass.lua b/include_files/depthpass.lua index fc8d87b..6fb5cf8 100644 --- a/include_files/depthpass.lua +++ b/include_files/depthpass.lua @@ -19,21 +19,30 @@ local BrushMaterialOverride = BrushMaterialOverride local WorldMaterialOverride = WorldMaterialOverride local ModelMaterialOverride = ModelMaterialOverride +local MatMaterialOverride +local MatBrushMaterialOverride +local MatWorldMaterialOverride +local MatModelMaterialOverride + function render.MaterialOverride(m) + MatMaterialOverride = m if bDepthPass then return end MaterialOverride(m) end function render.BrushMaterialOverride(m) + MatBrushMaterialOverride = m if bDepthPass then return end BrushMaterialOverride(m) end function render.WorldMaterialOverride(m) + MatWorldMaterialOverride = m if bDepthPass then return end WorldMaterialOverride(m) end function render.ModelMaterialOverride(m) + MatModelMaterialOverride = m if bDepthPass then return end ModelMaterialOverride(m) end @@ -71,10 +80,10 @@ local function PreDrawEffectsHK() RenderView() EndDepthPass() - MaterialOverride() - BrushMaterialOverride() - WorldMaterialOverride() - ModelMaterialOverride() + MaterialOverride(MatMaterialOverride) + BrushMaterialOverride(MatBrushMaterialOverride) + WorldMaterialOverride(MatWorldMaterialOverride) + ModelMaterialOverride(MatModelMaterialOverride) halo.Render = hRender bDepthPass = false @@ -93,6 +102,12 @@ function shaderlib.__INIT() halo = halo hRender = halo.Render + hook.Add("PreRender", "!!!EGSM_ImTooLazy", function() + MatMaterialOverride = nil + MatBrushMaterialOverride = nil + MatWorldMaterialOverride = nil + MatModelMaterialOverride = nil + end) hook.Add("PreDrawViewModel", "!!!EGSM_ImTooLazy", function() if bDepthPass then rClearDepth() end end) hook.Add("NeedsDepthPass", "!!!EGSM_ImTooLazy", PreDrawEffectsHK) diff --git a/premake5.lua b/premake5.lua index 68d31c3..feadac5 100644 --- a/premake5.lua +++ b/premake5.lua @@ -22,7 +22,6 @@ include("prepare_files_for_include.lua") include(gmcommon) - function CreateProject(config) assert(type(config) == "table", "supplied argument is not a table!") diff --git a/source/depthpass.lua.inc b/source/depthpass.lua.inc index 3dead54..75a73fa 100644 --- a/source/depthpass.lua.inc +++ b/source/depthpass.lua.inc @@ -1 +1 @@ -const char depthpass_lua[] = "local depthWriteMat = CreateMaterial( \"egsm/depthmat\", \"DepthWrite\", {\n"" [\"$no_fullbright\"] = \"1\",\n"" [\"$color_depth\"] = \"1\",\n"" [\"$alpha_test\"] = \"0\",\n""} )\n""local fixResolvedfullframedepthMat\n""\n""local bDepthPass = false\n""local halo = {}\n""local render = render\n""\n""MaterialOverride = MaterialOverride or render.MaterialOverride\n""BrushMaterialOverride = BrushMaterialOverride or render.BrushMaterialOverride \n""WorldMaterialOverride = WorldMaterialOverride or render.WorldMaterialOverride \n""ModelMaterialOverride = ModelMaterialOverride or render.ModelMaterialOverride \n""\n""local MaterialOverride = MaterialOverride\n""local BrushMaterialOverride = BrushMaterialOverride\n""local WorldMaterialOverride = WorldMaterialOverride\n""local ModelMaterialOverride = ModelMaterialOverride\n""\n""function render.MaterialOverride(m)\n"" if bDepthPass then return end\n"" MaterialOverride(m)\n""end\n""\n""function render.BrushMaterialOverride(m)\n"" if bDepthPass then return end\n"" BrushMaterialOverride(m)\n""end\n""\n""function render.WorldMaterialOverride(m)\n"" if bDepthPass then return end\n"" WorldMaterialOverride(m)\n""end\n""function render.ModelMaterialOverride(m)\n"" if bDepthPass then return end\n"" ModelMaterialOverride(m)\n""end\n""\n""local function dummyFn() end\n""\n""local PushRenderTarget = render.PushRenderTarget\n""local PopRenderTarget = render.PopRenderTarget\n""local rClear = render.Clear\n""local depthRT = render.GetResolvedFullFrameDepth()\n""local hRender = dummyFn\n""local BeginDepthPass = shaderlib.BeginDepthPass\n""local EndDepthPass = shaderlib.EndDepthPass\n""local RenderView = render.RenderView\n""local rClearDepth = render.ClearDepth\n""local resolvedDepthRT = render.GetResolvedFullFrameDepth()\n""local function PreDrawEffectsHK() \n"" if bDepthPass then return end\n"" bDepthPass = true\n"" \n"" halo.Render = dummyFn\n"" \n"" MaterialOverride( depthWriteMat )\n"" BrushMaterialOverride( depthWriteMat )\n"" WorldMaterialOverride( depthWriteMat )\n"" ModelMaterialOverride( depthWriteMat )\n"" \n"" BeginDepthPass()\n"" rClear(0,0,0,0) \n"" \n"" rClear(0,0,0,0)\n"" \n"" rClear(0,0,0,0) \n""\n"" RenderView()\n"" EndDepthPass()\n""\n"" MaterialOverride()\n"" BrushMaterialOverride()\n"" WorldMaterialOverride()\n"" ModelMaterialOverride()\n"" \n"" halo.Render = hRender\n"" bDepthPass = false\n"" \n"" render.PushRenderTarget(resolvedDepthRT)\n"" render.Clear(0,0,0,0, true, true)\n"" render.SetMaterial(fixResolvedfullframedepthMat)\n"" render.DrawScreenQuad()\n"" render.PopRenderTarget()\n""end\n""\n""local zero_vec = Vector(0,0,0)\n""local min,max = zero_vec, zero_vec\n""\n""function shaderlib.__INIT()\n"" halo = halo\n"" hRender = halo.Render\n"" \n"" hook.Add(\"PreDrawViewModel\", \"!!!EGSM_ImTooLazy\", function() if bDepthPass then rClearDepth() end end) \n"" hook.Add(\"NeedsDepthPass\", \"!!!EGSM_ImTooLazy\", PreDrawEffectsHK)\n"" \n"" hook.Add(\"PostDraw2DSkyBox\", \"!!!EGSM_ImTooLazy\", function()\n"" local rt = render.GetRenderTarget()\n"" if !rt or rt:GetName() != \"egsm_skyboxrt\" \n"" then \n"" return\n"" end\n"" cam.Start3D( zero_vec, EyeAngles() )\n"" min,max = game.GetWorld():GetModelBounds()\n"" \n"" render.SetMaterial( depthWriteMat )\n"" \n"" render.DrawBox( zero_vec, angle_zero, max, min, color_white )\n"" cam.End3D()\n"" end)\n"" \n"" \n"" shaderlib.CompileVertexShader(\"FixResolvedfullframedepthVS\", 0, [==[\n"" #include \"common_vs_fxc.h\"\n"" struct VS_INPUT\n"" {\n"" float4 vPos : POSITION;\n"" float4 vTexCoord : TEXCOORD0;\n"" };\n""\n"" struct VS_OUTPUT\n"" {\n"" float4 projPosSetup : POSITION;\n"" float4 vTexCoord : TEXCOORD0;\n"" };\n""\n"" VS_OUTPUT main( const VS_INPUT v )\n"" {\n"" VS_OUTPUT o = (VS_OUTPUT)0;\n"" o.projPosSetup = mul( v.vPos, cViewProj );\n"" o.vTexCoord = v.vTexCoord;\n"" return o;\n"" }\n"" ]==]) \n""\n"" shaderlib.CompilePixelShader(\"FixResolvedfullframedepthPS\", 0, [==[\n"" sampler WDBuffer : register(s0);\n""\n"" struct PS_IN\n"" {\n"" float2 vTexCoord : TEXCOORD0;\n"" };\n""\n"" float4 main(PS_IN i ) : COLOR\n"" {\n"" return float4((1/tex2D(WDBuffer, i.vTexCoord).w)/4000,0,0,1);\n"" }; \n"" ]==])\n""\n""\n"" local shader = shaderlib.NewShader(\"FixResolvedfullframedepth\")\n"" \n"" shader:SetPixelShader(\"FixResolvedfullframedepthPS\")\n"" shader:SetVertexShader(\"FixResolvedfullframedepthVS\")\n""\n"" shader:SetParamDefValue(PARAM_BASETEXTURE, \"_rt_WPNDepth\")\n"" shader:BindTexture(0, PARAM_BASETEXTURE)\n""\n"" fixResolvedfullframedepthMat = CreateMaterial(\"EGSMFixResolvedfullframedepth\", \"FixResolvedfullframedepth\", {} )\n""end\n"; \ No newline at end of file +const char depthpass_lua[] = "local depthWriteMat = CreateMaterial( \"egsm/depthmat\", \"DepthWrite\", {\n"" [\"$no_fullbright\"] = \"1\",\n"" [\"$color_depth\"] = \"1\",\n"" [\"$alpha_test\"] = \"0\",\n""} )\n""local fixResolvedfullframedepthMat\n""\n""local bDepthPass = false\n""local halo = {}\n""local render = render\n""\n""MaterialOverride = MaterialOverride or render.MaterialOverride\n""BrushMaterialOverride = BrushMaterialOverride or render.BrushMaterialOverride \n""WorldMaterialOverride = WorldMaterialOverride or render.WorldMaterialOverride \n""ModelMaterialOverride = ModelMaterialOverride or render.ModelMaterialOverride \n""\n""local MaterialOverride = MaterialOverride\n""local BrushMaterialOverride = BrushMaterialOverride\n""local WorldMaterialOverride = WorldMaterialOverride\n""local ModelMaterialOverride = ModelMaterialOverride\n""\n""local MatMaterialOverride \n""local MatBrushMaterialOverride\n""local MatWorldMaterialOverride\n""local MatModelMaterialOverride\n""\n""function render.MaterialOverride(m)\n"" MatMaterialOverride = m\n"" if bDepthPass then return end\n"" MaterialOverride(m)\n""end\n""\n""function render.BrushMaterialOverride(m)\n"" MatBrushMaterialOverride = m\n"" if bDepthPass then return end\n"" BrushMaterialOverride(m)\n""end\n""\n""function render.WorldMaterialOverride(m)\n"" MatWorldMaterialOverride = m\n"" if bDepthPass then return end\n"" WorldMaterialOverride(m)\n""end\n""function render.ModelMaterialOverride(m)\n"" MatModelMaterialOverride = m\n"" if bDepthPass then return end\n"" ModelMaterialOverride(m)\n""end\n""\n""local function dummyFn() end\n""\n""local PushRenderTarget = render.PushRenderTarget\n""local PopRenderTarget = render.PopRenderTarget\n""local rClear = render.Clear\n""local depthRT = render.GetResolvedFullFrameDepth()\n""local hRender = dummyFn\n""local BeginDepthPass = shaderlib.BeginDepthPass\n""local EndDepthPass = shaderlib.EndDepthPass\n""local RenderView = render.RenderView\n""local rClearDepth = render.ClearDepth\n""local resolvedDepthRT = render.GetResolvedFullFrameDepth()\n""local function PreDrawEffectsHK() \n"" if bDepthPass then return end\n"" bDepthPass = true\n"" \n"" halo.Render = dummyFn\n"" \n"" MaterialOverride( depthWriteMat )\n"" BrushMaterialOverride( depthWriteMat )\n"" WorldMaterialOverride( depthWriteMat )\n"" ModelMaterialOverride( depthWriteMat )\n"" \n"" BeginDepthPass()\n"" rClear(0,0,0,0) \n"" \n"" rClear(0,0,0,0)\n"" \n"" rClear(0,0,0,0) \n""\n"" RenderView()\n"" EndDepthPass()\n""\n"" MaterialOverride(MatMaterialOverride)\n"" BrushMaterialOverride(MatBrushMaterialOverride)\n"" WorldMaterialOverride(MatWorldMaterialOverride)\n"" ModelMaterialOverride(MatModelMaterialOverride)\n"" \n"" halo.Render = hRender\n"" bDepthPass = false\n"" \n"" render.PushRenderTarget(resolvedDepthRT)\n"" render.Clear(0,0,0,0, true, true)\n"" render.SetMaterial(fixResolvedfullframedepthMat)\n"" render.DrawScreenQuad()\n"" render.PopRenderTarget()\n""end\n""\n""local zero_vec = Vector(0,0,0)\n""local min,max = zero_vec, zero_vec\n""\n""function shaderlib.__INIT()\n"" halo = halo\n"" hRender = halo.Render\n"" \n"" hook.Add(\"PreRender\", \"!!!EGSM_ImTooLazy\", function() \n"" MatMaterialOverride = nil\n"" MatBrushMaterialOverride = nil\n"" MatWorldMaterialOverride = nil\n"" MatModelMaterialOverride = nil\n"" end) \n"" hook.Add(\"PreDrawViewModel\", \"!!!EGSM_ImTooLazy\", function() if bDepthPass then rClearDepth() end end) \n"" hook.Add(\"NeedsDepthPass\", \"!!!EGSM_ImTooLazy\", PreDrawEffectsHK)\n"" \n"" hook.Add(\"PostDraw2DSkyBox\", \"!!!EGSM_ImTooLazy\", function()\n"" local rt = render.GetRenderTarget()\n"" if !rt or rt:GetName() != \"egsm_skyboxrt\" \n"" then \n"" return\n"" end\n"" cam.Start3D( zero_vec, EyeAngles() )\n"" min,max = game.GetWorld():GetModelBounds()\n"" \n"" render.SetMaterial( depthWriteMat )\n"" \n"" render.DrawBox( zero_vec, angle_zero, max, min, color_white )\n"" cam.End3D()\n"" end)\n"" \n"" \n"" shaderlib.CompileVertexShader(\"FixResolvedfullframedepthVS\", 0, [==[\n"" #include \"common_vs_fxc.h\"\n"" struct VS_INPUT\n"" {\n"" float4 vPos : POSITION;\n"" float4 vTexCoord : TEXCOORD0;\n"" };\n""\n"" struct VS_OUTPUT\n"" {\n"" float4 projPosSetup : POSITION;\n"" float4 vTexCoord : TEXCOORD0;\n"" };\n""\n"" VS_OUTPUT main( const VS_INPUT v )\n"" {\n"" VS_OUTPUT o = (VS_OUTPUT)0;\n"" o.projPosSetup = mul( v.vPos, cViewProj );\n"" o.vTexCoord = v.vTexCoord;\n"" return o;\n"" }\n"" ]==]) \n""\n"" shaderlib.CompilePixelShader(\"FixResolvedfullframedepthPS\", 0, [==[\n"" sampler WDBuffer : register(s0);\n""\n"" struct PS_IN\n"" {\n"" float2 vTexCoord : TEXCOORD0;\n"" };\n""\n"" float4 main(PS_IN i ) : COLOR\n"" {\n"" return float4((1/tex2D(WDBuffer, i.vTexCoord).w)/4000,0,0,1);\n"" }; \n"" ]==])\n""\n""\n"" local shader = shaderlib.NewShader(\"FixResolvedfullframedepth\")\n"" \n"" shader:SetPixelShader(\"FixResolvedfullframedepthPS\")\n"" shader:SetVertexShader(\"FixResolvedfullframedepthVS\")\n""\n"" shader:SetParamDefValue(PARAM_BASETEXTURE, \"_rt_WPNDepth\")\n"" shader:BindTexture(0, PARAM_BASETEXTURE)\n""\n"" fixResolvedfullframedepthMat = CreateMaterial(\"EGSMFixResolvedfullframedepth\", \"FixResolvedfullframedepth\", {} )\n""end\n"; \ No newline at end of file diff --git a/source/shaderlib.cpp b/source/shaderlib.cpp index 9198f1c..6b1c1d5 100644 --- a/source/shaderlib.cpp +++ b/source/shaderlib.cpp @@ -1182,8 +1182,36 @@ namespace ShaderLib // return; //} + Define_method_Hook(KeyValues*, CMaterial_InitializeShader, void*, KeyValues& keyValues, KeyValues& patchKeyValues, int nFindContext) + { + auto v = keyValues.FindKey("EGSMShader"); - + if (v) + { + if (v->GetDataType() == v->TYPE_STRING) + { + auto name = keyValues.GetName(); + keyValues.SetName(v->GetString()); + auto ret = CMaterial_InitializeShader_trampoline()(_this, keyValues, patchKeyValues, nFindContext); + keyValues.SetName(name); + return ret; + } + else if (v->GetDataType() == v->TYPE_NONE) + { + auto sname = v->FindKey("Shader"); + if (sname) + { + auto name = v->GetName(); + v->SetName(sname->GetString()); + auto ret = CMaterial_InitializeShader_trampoline()(_this, *v, patchKeyValues, nFindContext); + v->SetName(name); + return ret; + } + } + } + + return CMaterial_InitializeShader_trampoline()(_this, keyValues, patchKeyValues, nFindContext); + } Define_method_Hook(void, CSkyboxView_Draw, CSkyboxView*) { @@ -1382,6 +1410,15 @@ namespace ShaderLib Setup_Hook(CMatRenderContextBase_Bind, Bind); } + { + static const char sign[] = + HOOK_SIGN_CHROMIUM_x32("55 8B EC 81 EC 28 07 00 00 53 56 8B F1 8B ? ? ? ? ? 57 89 75 F8 8B 01 FF 90 A8 01 00 00 8B 7D 08 33 DB 8B CF 89 45 E0 89 7D EC 89 5D E8 E8 ? ? ? ? 8B C8 85 C9 75 1C") + HOOK_SIGN_CHROMIUM_x64("40 53 55 56 57 41 54 41 56 41 57 48 81 EC 90 0B 00 00 48 8B ? ? ? ? ? 48 33 C4 48 89 84 24 70 0B 00 00 4C 8B F1 44 89 4C 24 44 48 8B ? ? ? ? ? 45 8B E1 4C 89 44 24 58 4C 8B FA 48 8B 01 FF 90 50 03 00 00 49 8B CF 4C 89 7C 24 48 48 89 44 24 50 33") + void* Bind = ScanSign(materialsystemdll, sign, sizeof(sign) - 1); + if (!Bind) { ShaderLibError("CMaterial::InitializeShader == NULL\n"); return 0; } + Setup_Hook(CMaterial_InitializeShader, Bind); + } + { //static const char sign[] = // HOOK_SIGN_CHROMIUM_x32("55 8B EC 56 8B F1 8B 4E 18 85 C9 74 46 8B 46 28 85 C0 74 0B 8B 00 85 C0 74 05 8B 40 08 EB 02 33 C0 A8 04 75 3C 8B 01 FF 10 8B 86 80 00 00 00 33 ? ? ? ? ? 8B")