diff --git a/Amalgam/src/Features/Configs/Configs.cpp b/Amalgam/src/Features/Configs/Configs.cpp index a0706c63..2aa998f1 100644 --- a/Amalgam/src/Features/Configs/Configs.cpp +++ b/Amalgam/src/Features/Configs/Configs.cpp @@ -470,7 +470,7 @@ bool CConfigs::SaveConfig(const std::string& sConfigName, bool bNotify) SaveJson(tChild, "OffscreenArrowsMaxDistance", tGroup.m_flOffscreenArrowsMaxDistance); SaveJson(tChild, "PickupTimer", tGroup.m_bPickupTimer); SaveJson(tChild, "Backtrack", tGroup.m_iBacktrack); - SaveJson(tChild, "BacktrackChams", tGroup.m_vBacktrackChams); + SaveJson(tChild, "BacktrackChams", tGroup.m_tBacktrackChams); SaveJson(tChild, "BacktrackGlow", tGroup.m_tBacktrackGlow); SaveJson(tChild, "Trajectory", tGroup.m_iTrajectory); SaveJson(tChild, "Sightlines", tGroup.m_iSightlines); @@ -586,7 +586,7 @@ bool CConfigs::LoadConfig(const std::string& sConfigName, bool bNotify) LoadJson(tChild, "OffscreenArrowsMaxDistance", tGroup.m_flOffscreenArrowsMaxDistance); LoadJson(tChild, "PickupTimer", tGroup.m_bPickupTimer); LoadJson(tChild, "Backtrack", tGroup.m_iBacktrack); - LoadJson(tChild, "BacktrackChams", tGroup.m_vBacktrackChams); + LoadJson(tChild, "BacktrackChams", tGroup.m_tBacktrackChams); LoadJson(tChild, "BacktrackGlow", tGroup.m_tBacktrackGlow); LoadJson(tChild, "Trajectory", tGroup.m_iTrajectory); LoadJson(tChild, "Sightlines", tGroup.m_iSightlines); @@ -679,7 +679,7 @@ bool CConfigs::SaveVisual(const std::string& sConfigName, bool bNotify) SaveJson(tChild, "OffscreenArrowsMaxDistance", tGroup.m_flOffscreenArrowsMaxDistance); SaveJson(tChild, "PickupTimer", tGroup.m_bPickupTimer); SaveJson(tChild, "Backtrack", tGroup.m_iBacktrack); - SaveJson(tChild, "BacktrackChams", tGroup.m_vBacktrackChams); + SaveJson(tChild, "BacktrackChams", tGroup.m_tBacktrackChams); SaveJson(tChild, "BacktrackGlow", tGroup.m_tBacktrackGlow); SaveJson(tChild, "Trajectory", tGroup.m_iTrajectory); SaveJson(tChild, "Sightlines", tGroup.m_iSightlines); @@ -762,7 +762,7 @@ bool CConfigs::LoadVisual(const std::string& sConfigName, bool bNotify) LoadJson(tChild, "OffscreenArrowsMaxDistance", tGroup.m_flOffscreenArrowsMaxDistance); LoadJson(tChild, "PickupTimer", tGroup.m_bPickupTimer); LoadJson(tChild, "Backtrack", tGroup.m_iBacktrack); - LoadJson(tChild, "BacktrackChams", tGroup.m_vBacktrackChams); + LoadJson(tChild, "BacktrackChams", tGroup.m_tBacktrackChams); LoadJson(tChild, "BacktrackGlow", tGroup.m_tBacktrackGlow); LoadJson(tChild, "Trajectory", tGroup.m_iTrajectory); LoadJson(tChild, "Sightlines", tGroup.m_iSightlines); diff --git a/Amalgam/src/Features/ImGui/Menu/Menu.cpp b/Amalgam/src/Features/ImGui/Menu/Menu.cpp index 81c8f667..1efae35d 100644 --- a/Amalgam/src/Features/ImGui/Menu/Menu.cpp +++ b/Amalgam/src/Features/ImGui/Menu/Menu.cpp @@ -1056,9 +1056,8 @@ void CMenu::MenuVisuals(int iTab) { FDropdown("##Draw", &tGroup.m_iBacktrack, { "Last", "First", "##Divider", "Always" }, { BacktrackEnum::Last, BacktrackEnum::First, BacktrackEnum::Always }, FDropdownEnum::Multi | FDropdownEnum::NoSanitization, 0, "All"); - FMDropdown("Material", &tGroup.m_vBacktrackChams, FDropdownEnum::Left); - SetCursorPos({ GetWindowWidth() / 2 + GetStyle().WindowPadding.x / 2, GetCursorPosY() - H::Draw.Scale(32) }); - FToggle("Ignore Z", &tGroup.m_iBacktrack, BacktrackEnum::IgnoreZ, FToggleEnum::Left); + FMDropdown("Visible material", &tGroup.m_tBacktrackChams.Visible, FDropdownEnum::Left); + FMDropdown("Occluded material", &tGroup.m_tBacktrackChams.Occluded, FDropdownEnum::Right); SetCursorPosY(GetCursorPosY() + H::Draw.Scale(8)); PushTransparent(!tGroup.m_tBacktrackGlow.Stencil); diff --git a/Amalgam/src/Features/Visuals/Chams/Chams.cpp b/Amalgam/src/Features/Visuals/Chams/Chams.cpp index 55e054fd..9e118b10 100644 --- a/Amalgam/src/Features/Visuals/Chams/Chams.cpp +++ b/Amalgam/src/Features/Visuals/Chams/Chams.cpp @@ -18,54 +18,91 @@ void CChams::End() I::ModelRender->ForcedMaterialOverride(m_pOriginalMaterial, m_iOriginalOverride); } -void CChams::DrawModel(CBaseEntity* pEntity, Chams_t& tChams, IMatRenderContext* pRenderContext, bool bTwoModels) +void CChams::DrawModel(CBaseEntity* pEntity, const Chams_t& tChams, IMatRenderContext* pRenderContext, int iModel, bool bTwoModel) { - const auto& vVisibleMaterials = !tChams.Visible.empty() ? tChams.Visible : std::vector> { { "None", {} } }; - const auto& vOccludedMaterials = !tChams.Occluded.empty() ? tChams.Occluded : std::vector> { { "None", {} } }; + if (!m_iFlags && iModel == ModelEnum::Visible) + m_mEntities[pEntity->entindex()]; + + bool bOccluded = !tChams.Occluded.empty(); + bool bSame = tChams.Visible == tChams.Occluded; + bTwoModel &= bOccluded && !bSame; Begin(); - if (bTwoModels) + switch (iModel) { - pRenderContext->SetStencilEnable(true); + case ModelEnum::Visible: + { + if (!bTwoModel) + { + if (bSame) + return; + } + else + { + pRenderContext->SetStencilEnable(true); + pRenderContext->SetStencilCompareFunction(STENCILCOMPARISONFUNCTION_ALWAYS); + pRenderContext->SetStencilPassOperation(STENCILOPERATION_REPLACE); + pRenderContext->SetStencilFailOperation(STENCILOPERATION_KEEP); + pRenderContext->SetStencilZFailOperation(STENCILOPERATION_KEEP); + pRenderContext->SetStencilReferenceValue(1); + pRenderContext->SetStencilWriteMask(0xFF); + pRenderContext->SetStencilTestMask(0x0); + } - pRenderContext->ClearBuffers(false, false, false); - pRenderContext->SetStencilCompareFunction(STENCILCOMPARISONFUNCTION_ALWAYS); - pRenderContext->SetStencilPassOperation(STENCILOPERATION_REPLACE); - pRenderContext->SetStencilFailOperation(STENCILOPERATION_KEEP); - pRenderContext->SetStencilZFailOperation(STENCILOPERATION_KEEP); - pRenderContext->SetStencilReferenceValue(1); - pRenderContext->SetStencilWriteMask(0xFF); - pRenderContext->SetStencilTestMask(0x0); + auto& vMaterials = tChams.GetVisible(); + for (auto& [sName, tColor] : vMaterials) + { + auto pMaterial = F::Materials.GetMaterial(FNV1A::Hash32(sName.c_str())); + + F::Materials.SetColor(pMaterial, tColor); + I::ModelRender->ForcedMaterialOverride(pMaterial ? pMaterial->m_pMaterial : nullptr); + if (pMaterial) + { + if (pMaterial->m_bInvertCull) + pRenderContext->CullMode(MATERIAL_CULLMODE_CW); + if (pMaterial->m_bBlockOccluded) + pRenderContext->SetStencilZFailOperation(STENCILOPERATION_REPLACE); + } + + m_bRendering = true; + pEntity->DrawModel(STUDIO_RENDER); + m_bRendering = false; + + if (pMaterial) + { + if (pMaterial->m_bInvertCull) + pRenderContext->CullMode(MATERIAL_CULLMODE_CCW); + if (pMaterial->m_bBlockOccluded) + pRenderContext->SetStencilZFailOperation(STENCILOPERATION_KEEP); + } + } + + if (bTwoModel) + pRenderContext->SetStencilEnable(false); + break; } - for (auto& [sName, tColor] : vVisibleMaterials) + case ModelEnum::Occluded: { - auto pMaterial = F::Materials.GetMaterial(FNV1A::Hash32(sName.c_str())); - - F::Materials.SetColor(pMaterial, tColor); - I::ModelRender->ForcedMaterialOverride(pMaterial ? pMaterial->m_pMaterial : nullptr); - if (pMaterial && pMaterial->m_bInvertCull) - pRenderContext->CullMode(MATERIAL_CULLMODE_CW); - - m_bRendering = true; - pEntity->DrawModel(STUDIO_RENDER); - m_bRendering = false; - - if (pMaterial && pMaterial->m_bInvertCull) - pRenderContext->CullMode(MATERIAL_CULLMODE_CCW); - } - if (bTwoModels) - { - pRenderContext->ClearBuffers(false, false, false); - pRenderContext->SetStencilCompareFunction(STENCILCOMPARISONFUNCTION_EQUAL); - pRenderContext->SetStencilPassOperation(STENCILOPERATION_KEEP); - pRenderContext->SetStencilFailOperation(STENCILOPERATION_KEEP); - pRenderContext->SetStencilZFailOperation(STENCILOPERATION_KEEP); - pRenderContext->SetStencilReferenceValue(0); - pRenderContext->SetStencilWriteMask(0x0); - pRenderContext->SetStencilTestMask(0xFF); + if (!bTwoModel) + { + if (!bOccluded) + return; + } + else + { + pRenderContext->SetStencilEnable(true); + pRenderContext->SetStencilCompareFunction(STENCILCOMPARISONFUNCTION_EQUAL); + pRenderContext->SetStencilPassOperation(STENCILOPERATION_KEEP); + pRenderContext->SetStencilFailOperation(STENCILOPERATION_KEEP); + pRenderContext->SetStencilZFailOperation(STENCILOPERATION_KEEP); + pRenderContext->SetStencilReferenceValue(0); + pRenderContext->SetStencilWriteMask(0x0); + pRenderContext->SetStencilTestMask(0xFF); + } pRenderContext->DepthRange(0.f, 0.2f); - for (auto& [sName, tColor] : vOccludedMaterials) + auto& vMaterials = tChams.GetOccluded(); + for (auto& [sName, tColor] : vMaterials) { auto pMaterial = F::Materials.GetMaterial(FNV1A::Hash32(sName.c_str())); @@ -82,10 +119,10 @@ void CChams::DrawModel(CBaseEntity* pEntity, Chams_t& tChams, IMatRenderContext* pRenderContext->CullMode(MATERIAL_CULLMODE_CCW); } - pRenderContext->SetStencilEnable(false); + if (bTwoModel) + pRenderContext->SetStencilEnable(false); pRenderContext->DepthRange(0.f, 1.f); - - m_mEntities[pEntity->entindex()]; + } } End(); } @@ -105,9 +142,9 @@ void CChams::Store(CTFPlayer* pLocal) if (pGroup->m_tChams() && !pEntity->IsWearableVM() && SDK::IsOnScreen(pEntity, pEntity->IsBaseCombatWeapon() || pEntity->IsWearable())) - m_vEntities.emplace_back(pEntity, pGroup->m_tChams); + m_vEntities.emplace_back(pEntity, &pGroup->m_tChams); - if (pEntity->IsPlayer() && pEntity != pLocal && pGroup->m_iBacktrack & BacktrackEnum::Enabled && !pGroup->m_vBacktrackChams.empty() + if (pEntity->IsPlayer() && pEntity != pLocal && pGroup->m_iBacktrack & BacktrackEnum::Enabled && pGroup->m_tBacktrackChams(false) && (F::Backtrack.GetFakeLatency() || F::Backtrack.GetFakeInterp() > G::Lerp || F::Backtrack.GetWindow())) { // backtrack auto pWeapon = H::Entities.GetWeapon(); @@ -120,16 +157,16 @@ void CChams::Store(CTFPlayer* pLocal) bShowFriendly = true, bShowEnemy = false; if (bShowEnemy && pEntity->m_iTeamNum() != pLocal->m_iTeamNum() || bShowFriendly && pEntity->m_iTeamNum() == pLocal->m_iTeamNum()) - m_vEntities.emplace_back(pEntity, Chams_t(pGroup->m_vBacktrackChams, {}), pGroup->m_iBacktrack); + m_vEntities.emplace_back(pEntity, &pGroup->m_tBacktrackChams, pGroup->m_iBacktrack); } } } Group_t* pGroup = nullptr; if (F::FakeAngle.bDrawChams && F::FakeAngle.bBonesSetup - && F::Groups.GetGroup(TargetsEnum::FakeAngle, pGroup) && pGroup->m_tChams(true)) + && F::Groups.GetGroup(TargetsEnum::FakeAngle, pGroup) && pGroup->m_tChams(false)) { // fakeangle - m_vEntities.emplace_back(pLocal, pGroup->m_tChams, 1); + m_vEntities.emplace_back(pLocal, &pGroup->m_tChams, 1); } } @@ -139,10 +176,16 @@ void CChams::RenderMain() if (!pRenderContext) return; + m_mEntities.clear(); + if (m_vEntities.empty()) + return; + + pRenderContext->ClearBuffers(false, false, true); + for (auto& tInfo : m_vEntities) { if (!tInfo.m_iFlags) - DrawModel(tInfo.m_pEntity, tInfo.m_tChams, pRenderContext); + DrawModel(tInfo.m_pEntity, *tInfo.m_pChams, pRenderContext, ModelEnum::Visible, true); else { m_iFlags = tInfo.m_iFlags; @@ -150,12 +193,31 @@ void CChams::RenderMain() auto pPlayer = tInfo.m_pEntity->As(); const float flOldInvisibility = pPlayer->m_flInvisibility(); pPlayer->m_flInvisibility() = 0.f; - DrawModel(tInfo.m_pEntity, tInfo.m_tChams, pRenderContext, false); + DrawModel(tInfo.m_pEntity, *tInfo.m_pChams, pRenderContext, ModelEnum::Visible, true); pPlayer->m_flInvisibility() = flOldInvisibility; m_iFlags = false; } } + for (auto& tInfo : m_vEntities) + { + if (!tInfo.m_iFlags) + DrawModel(tInfo.m_pEntity, *tInfo.m_pChams, pRenderContext, ModelEnum::Occluded, true); + else + { + m_iFlags = tInfo.m_iFlags; + + auto pPlayer = tInfo.m_pEntity->As(); + const float flOldInvisibility = pPlayer->m_flInvisibility(); + pPlayer->m_flInvisibility() = 0.f; + DrawModel(tInfo.m_pEntity, *tInfo.m_pChams, pRenderContext, ModelEnum::Occluded, true); + pPlayer->m_flInvisibility() = flOldInvisibility; + + m_iFlags = false; + } + } + + pRenderContext->ClearBuffers(false, false, true); } void CChams::RenderBacktrack(const DrawModelState_t& pState, const ModelRenderInfo_t& pInfo) @@ -178,8 +240,6 @@ void CChams::RenderBacktrack(const DrawModelState_t& pState, const ModelRenderIn bool bDrawLast = m_iFlags & BacktrackEnum::Last; bool bDrawFirst = m_iFlags & BacktrackEnum::First; - pRenderContext->DepthRange(0.f, m_iFlags & BacktrackEnum::IgnoreZ ? 0.2f : 1.f); - float flOriginalBlend = I::RenderView->GetBlend(); auto fDrawModel = [&](Vec3& vOrigin, const DrawModelState_t& pState, const ModelRenderInfo_t& pInfo, matrix3x4* pBoneToWorld, float flBlend) { @@ -214,21 +274,11 @@ void CChams::RenderBacktrack(const DrawModelState_t& pState, const ModelRenderIn } } I::RenderView->SetBlend(flOriginalBlend); - - pRenderContext->DepthRange(0.f, 1.f); } void CChams::RenderFakeAngle(const DrawModelState_t& pState, const ModelRenderInfo_t& pInfo) { - //auto pRenderContext = I::MaterialSystem->GetRenderContext(); - //if (!pRenderContext) - // return; - - //pRenderContext->DepthRange(0.f, Vars::Chams::FakeAngle::IgnoreZ.Value ? 0.2f : 1.f); - static auto IVModelRender_DrawModelExecute = U::Hooks.m_mHooks["IVModelRender_DrawModelExecute"]; IVModelRender_DrawModelExecute->Call(I::ModelRender, pState, pInfo, F::FakeAngle.aBones); - - //pRenderContext->DepthRange(0.f, 1.f); } void CChams::RenderHandler(const DrawModelState_t& pState, const ModelRenderInfo_t& pInfo, matrix3x4* pBoneToWorld) { diff --git a/Amalgam/src/Features/Visuals/Chams/Chams.h b/Amalgam/src/Features/Visuals/Chams/Chams.h index 89c92aa4..dba84db8 100644 --- a/Amalgam/src/Features/Visuals/Chams/Chams.h +++ b/Amalgam/src/Features/Visuals/Chams/Chams.h @@ -1,13 +1,15 @@ #pragma once #include "../../../SDK/SDK.h" +Enum(Model, Visible, Occluded); + class CChams { private: void Begin(); void End(); - void DrawModel(CBaseEntity* pEntity, Chams_t& tChams, IMatRenderContext* pRenderContext, bool bTwoModels = true); + void DrawModel(CBaseEntity* pEntity, const Chams_t& tChams, IMatRenderContext* pRenderContext, int iModel = ModelEnum::Visible, bool bTwoModel = false); void RenderBacktrack(const DrawModelState_t& pState, const ModelRenderInfo_t& pInfo); void RenderFakeAngle(const DrawModelState_t& pState, const ModelRenderInfo_t& pInfo); @@ -15,7 +17,7 @@ private: struct ChamsInfo_t { CBaseEntity* m_pEntity; - Chams_t m_tChams; + Chams_t* m_pChams; int m_iFlags = 0; }; std::vector m_vEntities = {}; diff --git a/Amalgam/src/Features/Visuals/Groups/Groups.h b/Amalgam/src/Features/Visuals/Groups/Groups.h index 146a3c08..d9daa925 100644 --- a/Amalgam/src/Features/Visuals/Groups/Groups.h +++ b/Amalgam/src/Features/Visuals/Groups/Groups.h @@ -1,13 +1,13 @@ #pragma once #include "../../../SDK/SDK.h" -Enum(Targets, Players = 1 << 0, Buildings = 1 << 1, Projectiles = 1 << 2, Ragdolls = 1 << 3, Objective = 1 << 4, NPCs = 1 << 5, Health = 1 << 6, Ammo = 1 << 7, Money = 1 << 8, Powerups = 1 << 9, Spellbook = 1 << 10, Bombs = 1 << 11, Gargoyle = 1 << 12, FakeAngle = 1 << 13, ViewmodelWeapon = 1 << 14, ViewmodelHands = 1 << 15, ESP = ~(Ragdolls | FakeAngle | ViewmodelWeapon | ViewmodelHands), Occluded = ~(FakeAngle | ViewmodelWeapon | ViewmodelHands)) +Enum(Targets, Players = 1 << 0, Buildings = 1 << 1, Projectiles = 1 << 2, Ragdolls = 1 << 3, Objective = 1 << 4, NPCs = 1 << 5, Health = 1 << 6, Ammo = 1 << 7, Money = 1 << 8, Powerups = 1 << 9, Spellbook = 1 << 10, Bombs = 1 << 11, Gargoyle = 1 << 12, FakeAngle = 1 << 13, ViewmodelWeapon = 1 << 14, ViewmodelHands = 1 << 15, ESP = ~(Ragdolls | FakeAngle | ViewmodelWeapon | ViewmodelHands), Occluded = ~(ViewmodelWeapon | ViewmodelHands)) Enum(Conditions, Enemy = 1 << 0, Team = 1 << 1, BLU = 1 << 2, RED = 1 << 3, Local = 1 << 4, Friends = 1 << 5, Party = 1 << 6, Priority = 1 << 7, Target = 1 << 8, Dormant = 1 << 9) Enum(Player, Scout = 1 << 0, Soldier = 1 << 1, Pyro = 1 << 2, Demoman = 1 << 3, Heavy = 1 << 4, Engineer = 1 << 5, Medic = 1 << 6, Sniper = 1 << 7, Spy = 1 << 8, Invulnerable = 1 << 9, Crits = 1 << 10, Invisible = 1 << 11, Disguise = 1 << 12, Hurt = 1 << 13, Classes = Scout | Soldier | Pyro | Demoman | Heavy | Engineer | Medic | Sniper | Spy, Conds = Invulnerable | Crits | Invisible | Disguise | Hurt) Enum(Building, Sentry = 1 << 0, Dispenser = 1 << 1, Teleporter = 1 << 2, Hurt = 1 << 3, Classes = Sentry | Dispenser | Teleporter, Conds = Hurt) Enum(Projectile, Rocket = 1 << 0, Sticky = 1 << 1, Pipe = 1 << 2, Arrow = 1 << 3, Heal = 1 << 4, Flare = 1 << 5, Fire = 1 << 6, Repair = 1 << 7, Cleaver = 1 << 8, Milk = 1 << 9, Jarate = 1 << 10, Gas = 1 << 11, Bauble = 1 << 12, Baseball = 1 << 13, Energy = 1 << 14, ShortCircuit = 1 << 15, MeteorShower = 1 << 16, Lightning = 1 << 17, Fireball = 1 << 18, Bomb = 1 << 19, Bats = 1 << 20, Pumpkin = 1 << 21, Monoculus = 1 << 22, Skeleton = 1 << 23, Misc = 1 << 24, Crit = 1 << 25, Minicrit = 1 << 26, Classes = Rocket | Sticky | Pipe | Arrow | Heal | Flare | Fire | Repair | Cleaver | Milk | Jarate | Gas | Bauble | Baseball | Energy | ShortCircuit | MeteorShower | Lightning | Fireball | Bomb | Bats | Pumpkin | Monoculus | Skeleton | Misc, Conds = Crit | Minicrit) Enum(ESP, Name = 1 << 0, Box = 1 << 1, Distance = 1 << 2, Bones = 1 << 3, HealthBar = 1 << 4, HealthText = 1 << 5, UberBar = 1 << 6, UberText = 1 << 7, ClassIcon = 1 << 8, ClassText = 1 << 9, WeaponIcon = 1 << 10, WeaponText = 1 << 11, Priority = 1 << 12, Labels = 1 << 13, Buffs = 1 << 14, Debuffs = 1 << 15, Flags = 1 << 16, LagCompensation = 1 << 17, Ping = 1 << 18, KDR = 1 << 19, Owner = 1 << 20, Level = 1 << 21, AmmoBars = 1 << 22, AmmoText = 1 << 23, IntelReturnTime = 1 << 24) -Enum(Backtrack, Enabled = 1 << 0, IgnoreZ = 1 << 1, Last = 1 << 2, First = 1 << 3, Always = 1 << 4) +Enum(Backtrack, Enabled = 1 << 0, Last = 1 << 1, First = 1 << 2, Always = 1 << 3) Enum(Trajectory, Enabled = 1 << 0, IgnoreZ = 1 << 1, Predict = 1 << 2, Radius = 1 << 3, Trace = 1 << 4, Sphere = 1 << 5, Path = 1 << 6) Enum(Sightlines, Enabled = 1 << 0, IgnoreZ = 1 << 1) @@ -37,7 +37,7 @@ struct Group_t bool m_bPickupTimer = false; int m_iBacktrack = 0b0; - std::vector> m_vBacktrackChams = {}; + Chams_t m_tBacktrackChams = { {}, {} }; Glow_t m_tBacktrackGlow = {}; int m_iTrajectory = 0b0; diff --git a/Amalgam/src/Features/Visuals/Materials/Materials.cpp b/Amalgam/src/Features/Visuals/Materials/Materials.cpp index c2b5a554..87140263 100644 --- a/Amalgam/src/Features/Visuals/Materials/Materials.cpp +++ b/Amalgam/src/Features/Visuals/Materials/Materials.cpp @@ -58,6 +58,10 @@ static inline void StoreVars(Material_t& tMaterial) auto $invertcull = tMaterial.m_pMaterial->FindVar("$invertcull", &bFound, false); if (bFound && $invertcull && $invertcull->GetIntValueInternal()) tMaterial.m_bInvertCull = true; + + auto $blockoccluded = tMaterial.m_pMaterial->FindVar("$blockoccluded", &bFound, false); + if (bFound && $blockoccluded && $blockoccluded->GetIntValueInternal()) + tMaterial.m_bBlockOccluded = true; } static inline void RemoveVars(Material_t& tMaterial) @@ -66,6 +70,7 @@ static inline void RemoveVars(Material_t& tMaterial) tMaterial.m_phongtint = nullptr; tMaterial.m_envmaptint = nullptr; tMaterial.m_bInvertCull = false; + tMaterial.m_bBlockOccluded = false; } static inline void ModifyKeyValues(KeyValues* pKV) @@ -386,7 +391,8 @@ void CMaterials::RemoveMaterial(const char* sName) { fRemoveFromVal(tGroup.m_tChams.Visible); fRemoveFromVal(tGroup.m_tChams.Occluded); - fRemoveFromVal(tGroup.m_vBacktrackChams); + fRemoveFromVal(tGroup.m_tBacktrackChams.Visible); + fRemoveFromVal(tGroup.m_tBacktrackChams.Occluded); } } diff --git a/Amalgam/src/Features/Visuals/Materials/Materials.h b/Amalgam/src/Features/Visuals/Materials/Materials.h index 4deac1a4..44c72561 100644 --- a/Amalgam/src/Features/Visuals/Materials/Materials.h +++ b/Amalgam/src/Features/Visuals/Materials/Materials.h @@ -13,6 +13,7 @@ struct Material_t IMaterialVar* m_phongtint = nullptr; IMaterialVar* m_envmaptint = nullptr; bool m_bInvertCull = false; + bool m_bBlockOccluded = false; }; class CMaterials diff --git a/Amalgam/src/Hooks/CClientModeShared_DoPostScreenSpaceEffects.cpp b/Amalgam/src/Hooks/CClientModeShared_DoPostScreenSpaceEffects.cpp index 5c29da03..abc11dd7 100644 --- a/Amalgam/src/Hooks/CClientModeShared_DoPostScreenSpaceEffects.cpp +++ b/Amalgam/src/Hooks/CClientModeShared_DoPostScreenSpaceEffects.cpp @@ -22,13 +22,11 @@ MAKE_HOOK(CClientModeShared_DoPostScreenSpaceEffects, U::Memory.GetVirtual(I::Cl return CALL_ORIGINAL(rcx, pSetup); F::Visuals.DrawEffects(); - F::Chams.m_mEntities.clear(); if (I::EngineVGui->IsGameUIVisible() || !F::Materials.m_bLoaded) return CALL_ORIGINAL(rcx, pSetup); F::Chams.RenderMain(); F::Glow.RenderFirst(); - return CALL_ORIGINAL(rcx, pSetup); } @@ -38,7 +36,6 @@ MAKE_HOOK(CViewRender_DrawViewModels, S::CViewRender_DrawViewModels(), void, DEBUG_RETURN(CViewRender_DrawViewModels, rcx, viewRender, drawViewmodel); CALL_ORIGINAL(rcx, viewRender, F::Spectate.HasTarget() && !I::EngineClient->IsHLTV() ? false : drawViewmodel); - if (SDK::CleanScreenshot() || F::CameraWindow.m_bDrawing || I::EngineVGui->IsGameUIVisible() || !F::Materials.m_bLoaded) return; diff --git a/Amalgam/src/SDK/Definitions/Types.h b/Amalgam/src/SDK/Definitions/Types.h index 90782420..b96b0017 100644 --- a/Amalgam/src/SDK/Definitions/Types.h +++ b/Amalgam/src/SDK/Definitions/Types.h @@ -1101,6 +1101,11 @@ struct Gradient_t struct Chams_t { +private: + static inline const std::vector> s_vNone = std::vector>{ { "None", {} } }; + static inline const std::vector> s_vOriginal = std::vector>{ { "Original", {} } }; + +public: std::vector> Visible = { { "Original", Color_t() } }; std::vector> Occluded = {}; @@ -1114,9 +1119,19 @@ struct Chams_t return Visible != t.Visible || Occluded != t.Occluded; } - inline bool operator()(bool bVisibleOnly = false) const + inline bool operator()(bool bDefault = true) const { - return Visible != std::vector>{ { "Original", Color_t() } } || !bVisibleOnly && !Occluded.empty(); + return (bDefault ? Visible != s_vOriginal : !Visible.empty()) || !Occluded.empty(); + } + + const std::vector>& GetVisible() const + { + return !Visible.empty() ? Visible : s_vNone; + } + + const std::vector>& GetOccluded() const + { + return !Occluded.empty() ? Occluded : s_vNone; } };