Залив
This commit is contained in:
273
lua/entities/mg_viewmodel/client/cl_render.lua
Normal file
273
lua/entities/mg_viewmodel/client/cl_render.lua
Normal file
@@ -0,0 +1,273 @@
|
||||
local function drawModels(vm, ent, flags)
|
||||
--https://github.com/Facepunch/garrysmod-issues/issues/4821
|
||||
--i didn't need this before, but now i do :shrug:
|
||||
ent:RemoveEFlags(EFL_USE_PARTITION_WHEN_NOT_SOLID)
|
||||
|
||||
local children = ent:GetChildren()
|
||||
local numChildren = #children
|
||||
|
||||
if (ent:IsEffectActive(EF_BONEMERGE)) then
|
||||
if (ent == vm.m_CHands) then
|
||||
ent:SetRenderOrigin(LocalToWorld(-ent:OBBCenter(), mw_math.ZeroAngle, vm:GetRenderOrigin(), vm:GetRenderAngles()))
|
||||
else
|
||||
if (ent:EntIndex() < 0) then
|
||||
ent:SetRenderOrigin(vm:GetRenderOrigin())
|
||||
end
|
||||
|
||||
if (numChildren > 0) then
|
||||
--some weird issue on windowed needs this
|
||||
ent:SetupBones()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if ((numChildren <= 0 || ent:EntIndex() > 0) && !ent.bAttachmentRenderOverride) then
|
||||
ent:DrawModel(flags)
|
||||
end
|
||||
|
||||
ent.CustomizationAnimationDelta = 0
|
||||
|
||||
for c = 1, numChildren do
|
||||
drawModels(vm, children[c], flags)
|
||||
end
|
||||
end
|
||||
|
||||
local function isCustomizing()
|
||||
return IsValid(MW_CUSTOMIZEMENU)
|
||||
end
|
||||
|
||||
local function drawCustomizationBackground()
|
||||
if (!isCustomizing()) then
|
||||
return
|
||||
end
|
||||
|
||||
cam.Start2D()
|
||||
surface.SetDrawColor(0, 0, 0, MW_CUSTOMIZEMENU.AlphaDelta * 200)
|
||||
surface.DrawRect(0, 0, ScrW(), ScrH())
|
||||
cam.End2D()
|
||||
end
|
||||
|
||||
local function shouldDrawModel(model, children)
|
||||
for _, c in pairs(children) do
|
||||
if (!c:IsEffectActive(EF_BONEMERGE)) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
return #children <= 0 || model:EntIndex() > 0
|
||||
end
|
||||
|
||||
local function drawCustomizationHighlights(model, flags, refvalue)
|
||||
model.CustomizationAnimationDelta = (model.CustomizationAnimationDelta || 0) - (math.min(FrameTime(), 0.1) * 3)
|
||||
|
||||
local children = model:GetChildren()
|
||||
|
||||
if (shouldDrawModel(model, children)) then
|
||||
model:RemoveEFlags(EFL_USE_PARTITION_WHEN_NOT_SOLID)
|
||||
|
||||
if (#children > 0) then
|
||||
--some weird issue on windowed needs this
|
||||
model:SetupBones()
|
||||
end
|
||||
|
||||
render.SetStencilWriteMask(0xFF)
|
||||
render.SetStencilTestMask(0xFF)
|
||||
render.SetStencilReferenceValue(0)
|
||||
|
||||
render.SetStencilCompareFunction(STENCIL_ALWAYS)
|
||||
render.SetStencilPassOperation(STENCIL_REPLACE)
|
||||
render.SetStencilFailOperation(STENCIL_KEEP)
|
||||
render.SetStencilZFailOperation(STENCIL_KEEP)
|
||||
|
||||
render.SetStencilEnable(true)
|
||||
render.SetStencilReferenceValue(refvalue + 1)
|
||||
model:RemoveEFlags(EFL_USE_PARTITION_WHEN_NOT_SOLID)
|
||||
model:DrawModel(flags)
|
||||
render.SetStencilCompareFunction(STENCIL_EQUAL)
|
||||
|
||||
if (model.CustomizationAnimationDelta > 0) then
|
||||
cam.Start2D()
|
||||
surface.SetDrawColor(model.CustomizationAnimationColor.r, model.CustomizationAnimationColor.g, model.CustomizationAnimationColor.b, model.CustomizationAnimationDelta * 200)
|
||||
surface.DrawRect(0, 0, ScrW(), ScrH())
|
||||
cam.End2D()
|
||||
end
|
||||
|
||||
render.SetStencilEnable(false)
|
||||
end
|
||||
|
||||
for i, c in pairs(children) do
|
||||
drawCustomizationHighlights(c, flags, refvalue + i + #c:GetChildren()) --this is gonna get out of hand eventually
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:Draw(flags)
|
||||
if (GetConVar("mgbase_debug_vmrender"):GetInt() <= 0) then
|
||||
return
|
||||
end
|
||||
|
||||
if (self.m_LastSequenceIndex == "INIT" || self:GetRenderOrigin() == nil) then
|
||||
--calcview / no anim called
|
||||
return
|
||||
end
|
||||
|
||||
local w = self:GetOwner()
|
||||
|
||||
if (!IsValid(w) || !w:IsCarriedByLocalPlayer()) then
|
||||
return
|
||||
end
|
||||
|
||||
if (IsValid(w:GetOwner())) then
|
||||
w:GetOwner():DrawViewModel(false)
|
||||
end
|
||||
|
||||
render.SetColorModulation(1, 1, 1)
|
||||
drawCustomizationBackground()
|
||||
|
||||
self:DrawShadow(false)
|
||||
|
||||
self.bRendering = true
|
||||
self:SetupBones() --makes velements and vmanip work
|
||||
self.bRendering = false
|
||||
|
||||
if (!isCustomizing()) then
|
||||
if (!w:HasFlag("Holstering") || CurTime() <= w:GetNextHolsterTime()) then
|
||||
self:SetNoDraw(false)
|
||||
drawModels(self, self, flags)
|
||||
|
||||
for name, particleSystem in pairs(self.m_Particles) do
|
||||
if (!particleSystem:IsValid() || particleSystem:IsFinished()) then
|
||||
self.m_Particles[name] = nil
|
||||
continue
|
||||
end
|
||||
|
||||
particleSystem:Render()
|
||||
end
|
||||
|
||||
--attachments
|
||||
local atts = w:GetAllAttachmentsInUse()
|
||||
|
||||
for slot = #atts, 1, -1 do
|
||||
if (IsValid(atts[slot].m_Model)) then
|
||||
atts[slot]:Render(w, atts[slot].m_Model)
|
||||
end
|
||||
end
|
||||
end
|
||||
self:SetNoDraw(true)
|
||||
else
|
||||
--self.m_CHands:SetNoDraw(false)
|
||||
self.m_CHands:DrawModel(flags)
|
||||
--self.m_CHands:SetNoDraw(true)
|
||||
drawCustomizationHighlights(self, flags, MWBASE_STENCIL_REFVALUE + 17)
|
||||
end
|
||||
|
||||
for shell, _ in pairs(self.m_Shells) do
|
||||
if (!IsValid(shell)) then
|
||||
self.m_Shells[shell] = nil
|
||||
continue
|
||||
end
|
||||
|
||||
shell:DrawModel(flags)
|
||||
end
|
||||
|
||||
self:ViewBlur()
|
||||
|
||||
if (IsValid(w:GetOwner())) then
|
||||
w:GetOwner():DrawViewModel(true)
|
||||
end
|
||||
end
|
||||
|
||||
local function drawBlurModels(model, flags)
|
||||
local children = model:GetChildren()
|
||||
|
||||
--if (shouldDrawModel(model, children)) then
|
||||
model:RemoveEFlags(EFL_USE_PARTITION_WHEN_NOT_SOLID)
|
||||
model:DrawModel(flags)
|
||||
--end
|
||||
|
||||
for i, c in pairs(children) do
|
||||
drawBlurModels(c, flags) --this is gonna get out of hand eventually
|
||||
end
|
||||
end
|
||||
|
||||
local blurMaterial = Material("mg/blur.vmt")
|
||||
ENT.LerpBlur = 0
|
||||
function ENT:ViewBlur()
|
||||
local w = self:GetOwner()
|
||||
|
||||
if (!IsValid(w)) then
|
||||
return
|
||||
end
|
||||
|
||||
local bPixelShaders2 = render.SupportsPixelShaders_2_0()
|
||||
|
||||
if (!bPixelShaders2) then
|
||||
return
|
||||
end
|
||||
|
||||
if (GetConVar("mgbase_fx_blur"):GetInt() != 1) then return end
|
||||
|
||||
if (w.DisableReloadBlur && w:HasFlag("Reloading")) then return end
|
||||
|
||||
local bOpticAim = (w:GetAimDelta() > 0 && w:GetSight() != nil && w:GetSight().Optic != nil && w:GetAimModeDelta() <= w.m_hybridSwitchThreshold)
|
||||
local bCanBlur = w:HasFlag("Reloading") || w:HasFlag("Customizing") || bOpticAim || (CurTime() < w:GetNextInspectTime() && w.m_seqIndex == "Inspect")
|
||||
|
||||
if (bCanBlur) then
|
||||
local delta = 1 - w:GetAimDelta()
|
||||
|
||||
if (bOpticAim) then
|
||||
delta = w:GetAimDelta()
|
||||
end
|
||||
|
||||
if (CurTime() < w:GetNextInspectTime() && w.m_seqIndex == "Inspect") then
|
||||
delta = self:GetCycle() > 0.8 && 0 || 1
|
||||
end
|
||||
|
||||
self.LerpBlur = Lerp(5 * FrameTime(), self.LerpBlur, 5 * delta)
|
||||
|
||||
render.SetStencilWriteMask(0xFF)
|
||||
render.SetStencilTestMask(0xFF)
|
||||
render.SetStencilReferenceValue(0)
|
||||
render.SetStencilPassOperation(STENCIL_KEEP)
|
||||
render.SetStencilZFailOperation(STENCIL_KEEP)
|
||||
render.ClearStencil()
|
||||
render.SetStencilEnable(true)
|
||||
render.SetStencilReferenceValue(MWBASE_STENCIL_REFVALUE + 13)
|
||||
render.SetStencilCompareFunction(STENCIL_NEVER)
|
||||
render.SetStencilFailOperation(STENCIL_REPLACE)
|
||||
render.SetBlend(0)
|
||||
|
||||
if (w:GetAimDelta() < 1) then
|
||||
drawBlurModels(self, flags)
|
||||
elseif (w:GetSight() != nil && IsValid(w:GetSight().hideModel)) then
|
||||
w:GetSight().m_Model:SetupBones()
|
||||
w:GetSight().m_Model:InvalidateBoneCache()
|
||||
local matrix = w:GetSight().m_Model:GetBoneMatrix(0)
|
||||
|
||||
w:GetSight().hideModel:SetPos(matrix:GetTranslation())
|
||||
w:GetSight().hideModel:SetAngles(matrix:GetAngles())
|
||||
|
||||
w:GetSight().hideModel:DrawModel()
|
||||
end
|
||||
render.SetBlend(1)
|
||||
render.SetStencilCompareFunction(STENCIL_NOTEQUAL)
|
||||
cam.Start2D()
|
||||
for i = 1, self.LerpBlur, 1 do
|
||||
render.UpdateScreenEffectTexture()
|
||||
surface.SetMaterial(blurMaterial)
|
||||
surface.SetDrawColor(255, 255, 255, 255)
|
||||
surface.DrawTexturedRect(0, 0, ScrW(), ScrH())
|
||||
end
|
||||
cam.End2D()
|
||||
render.SetStencilEnable(false)
|
||||
render.ClearStencil()
|
||||
else
|
||||
self.LerpBlur = 0
|
||||
end
|
||||
end
|
||||
|
||||
--[[hook.Add("VManipVMEntity", "MW19_VManipEntity", function(ply, weapon)
|
||||
--this is probably not necessary since vmanip already looks for m_ViewModel
|
||||
if (weapons.IsBasedOn(weapon:GetClass(), "mg_base")) then
|
||||
return weapon:GetViewModel()
|
||||
end
|
||||
end)]]
|
||||
Reference in New Issue
Block a user