mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
Upload
This commit is contained in:
968
lua/weapons/arccw_base/cl_holosight.lua
Normal file
968
lua/weapons/arccw_base/cl_holosight.lua
Normal file
@@ -0,0 +1,968 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
function SWEP:DoHolosight()
|
||||
|
||||
-- In VRMod, we draw all holosights all the time
|
||||
if vrmod and vrmod.IsPlayerInVR(self:GetOwner()) then
|
||||
for i, asight in pairs(self.SightTable) do
|
||||
local aslot = self.Attachments[asight.Slot] or {}
|
||||
local atttbl = asight.HolosightData
|
||||
|
||||
if !atttbl and aslot.Installed then
|
||||
atttbl = ArcCW.AttachmentTable[aslot.Installed]
|
||||
|
||||
if !atttbl.Holosight then return end
|
||||
end
|
||||
|
||||
if atttbl then
|
||||
local hsp = asight.HolosightPiece or self.HSPElement
|
||||
local hsm = asight.HolosightModel
|
||||
|
||||
if !hsp and !hsm then
|
||||
self:SetupActiveSights()
|
||||
return
|
||||
end
|
||||
|
||||
self:DrawHolosight(atttbl, hsm, hsp, asight)
|
||||
end
|
||||
end
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
local asight = self:GetActiveSights()
|
||||
if !asight then return end
|
||||
local aslot = self.Attachments[asight.Slot] or {}
|
||||
|
||||
local atttbl = asight.HolosightData
|
||||
|
||||
if !atttbl and aslot.Installed then
|
||||
atttbl = ArcCW.AttachmentTable[aslot.Installed]
|
||||
|
||||
if !atttbl.Holosight then return end
|
||||
end
|
||||
|
||||
if atttbl then
|
||||
local hsp = asight.HolosightPiece or self.HSPElement
|
||||
local hsm = asight.HolosightModel
|
||||
|
||||
if !hsp and !hsm then
|
||||
self:SetupActiveSights()
|
||||
return
|
||||
end
|
||||
|
||||
self:DrawHolosight(atttbl, hsm, hsp)
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:ShouldFlatScope()
|
||||
return false -- this system was removed, but we need to keep this function
|
||||
end
|
||||
|
||||
local rtsize = ScrH()
|
||||
|
||||
local rtmat = GetRenderTarget("arccw_rtmat", rtsize, rtsize, false)
|
||||
local rtmat_cheap = GetRenderTarget("arccw_rtmat_cheap", ScrW(), ScrH(), false)
|
||||
local rtmat_spare = GetRenderTarget("arccw_rtmat_spare", ScrW(), ScrH(), false)
|
||||
|
||||
|
||||
local thermal = Material("models/debug/debugwhite")
|
||||
local colormod = Material("pp/colour")
|
||||
local coldtime = 30
|
||||
|
||||
local additionalFOVconvar = ArcCW.ConVars["vm_add_ads"]
|
||||
|
||||
local matRefract = Material("pp/arccw/refract_rt")
|
||||
local matRefract_cheap = Material("pp/arccw/refract_cs") -- cheap scopes stretches square overlays so i need to make it 16x9
|
||||
|
||||
matRefract:SetTexture("$fbtexture", render.GetScreenEffectTexture())
|
||||
matRefract_cheap:SetTexture("$fbtexture", render.GetScreenEffectTexture())
|
||||
|
||||
timer.Create("ihategmod", 5, 0, function() -- i really dont know what the fucking problem with cheap scopes they dont want to set texture as not cheap ones
|
||||
matRefract_cheap:SetTexture("$fbtexture", render.GetScreenEffectTexture())
|
||||
matRefract:SetTexture("$fbtexture", render.GetScreenEffectTexture()) -- not cheap scope here why not
|
||||
end)
|
||||
|
||||
local pp_ca_base, pp_ca_r, pp_ca_g, pp_ca_b = Material("pp/arccw/ca_base"), Material("pp/arccw/ca_r"), Material("pp/arccw/ca_g"), Material("pp/arccw/ca_b")
|
||||
local pp_ca_r_thermal, pp_ca_g_thermal, pp_ca_b_thermal = Material("pp/arccw/ca_r_thermal"), Material("pp/arccw/ca_g_thermal"), Material("pp/arccw/ca_b_thermal")
|
||||
|
||||
pp_ca_r:SetTexture("$basetexture", render.GetScreenEffectTexture())
|
||||
pp_ca_g:SetTexture("$basetexture", render.GetScreenEffectTexture())
|
||||
pp_ca_b:SetTexture("$basetexture", render.GetScreenEffectTexture())
|
||||
|
||||
pp_ca_r_thermal:SetTexture("$basetexture", render.GetScreenEffectTexture())
|
||||
pp_ca_g_thermal:SetTexture("$basetexture", render.GetScreenEffectTexture())
|
||||
pp_ca_b_thermal:SetTexture("$basetexture", render.GetScreenEffectTexture())
|
||||
|
||||
local greenColor = Color(0, 255, 0) -- optimized +10000fps
|
||||
local whiteColor = Color(255, 255, 255)
|
||||
local blackColor = Color(0, 0, 0)
|
||||
|
||||
local function DrawTexturedRectRotatedPoint( x, y, w, h, rot, x0, y0 ) -- stolen from gmod wiki
|
||||
local c = math.cos( math.rad( rot ) )
|
||||
local s = math.sin( math.rad( rot ) )
|
||||
|
||||
local newx = y0 * s - x0 * c
|
||||
local newy = y0 * c + x0 * s
|
||||
|
||||
surface.DrawTexturedRectRotated( x + newx, y + newy, w, h, rot )
|
||||
end
|
||||
|
||||
|
||||
local function IsWHOT(ent)
|
||||
if !ent:IsValid() or ent:IsWorld() then return false end
|
||||
|
||||
if ent:IsPlayer() then -- balling
|
||||
if ent.ArcticMedShots_ActiveEffects and ent.ArcticMedShots_ActiveEffects["coldblooded"] or ent:Health() <= 0 then return false end -- arc stims
|
||||
return true
|
||||
end
|
||||
|
||||
if ent:IsNPC() or ent:IsNextBot() then -- npcs
|
||||
if ent.ArcCWCLHealth and ent.ArcCWCLHealth <= 0 or ent:Health() <= 0 then return false end
|
||||
return true
|
||||
end
|
||||
|
||||
if ent:IsRagdoll() then -- ragdolling
|
||||
if !ent.ArcCW_ColdTime then ent.ArcCW_ColdTime = CurTime() + coldtime end
|
||||
return ent.ArcCW_ColdTime > CurTime()
|
||||
end
|
||||
|
||||
if ent:IsVehicle() or ent:IsOnFire() or ent.ArcCW_Hot or ent:IsScripted() and !ent:GetOwner():IsValid() then -- vroom vroom + :fire: + ents but not guns (guns on ground will be fine)
|
||||
return true
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
function SWEP:FormThermalImaging(tex)
|
||||
if !tex then
|
||||
tex = render.GetRenderTarget()
|
||||
end
|
||||
|
||||
render.PushRenderTarget(tex)
|
||||
|
||||
cam.Start3D()
|
||||
|
||||
if tex then
|
||||
colormod:SetTexture("$fbtexture", tex)
|
||||
else
|
||||
colormod:SetTexture("$fbtexture", render.GetScreenEffectTexture())
|
||||
end
|
||||
|
||||
local asight = self:GetActiveSights()
|
||||
|
||||
local nvsc = asight.ThermalScopeColor or whiteColor
|
||||
local tvsc = asight.ThermalHighlightColor or whiteColor
|
||||
|
||||
local tab = ents.GetAll()
|
||||
|
||||
-- table.Add(tab, player.GetAll())
|
||||
-- table.Add(tab, ents.FindByClass("npc_*"))
|
||||
|
||||
render.SetStencilEnable(true)
|
||||
render.SetStencilWriteMask(255)
|
||||
render.SetStencilTestMask(255)
|
||||
render.ClearStencil()
|
||||
|
||||
local sw = ScrH()
|
||||
local sh = sw
|
||||
|
||||
local sx = (ScrW() - sw) / 2
|
||||
local sy = (ScrH() - sh) / 2
|
||||
|
||||
render.SetScissorRect( sx, sy, sx + sw, sy + sh, true )
|
||||
|
||||
render.SetStencilReferenceValue(64)
|
||||
|
||||
render.SetStencilPassOperation(STENCIL_REPLACE)
|
||||
render.SetStencilFailOperation(STENCIL_KEEP)
|
||||
render.SetStencilZFailOperation(STENCIL_KEEP)
|
||||
render.SetStencilCompareFunction(STENCIL_ALWAYS)
|
||||
|
||||
for _, v in pairs(tab) do
|
||||
|
||||
if !IsWHOT(v) then continue end
|
||||
|
||||
if !asight.ThermalScopeSimple then
|
||||
render.SetBlend(0.5)
|
||||
render.SuppressEngineLighting(true)
|
||||
|
||||
render.SetColorModulation(250, 250, 250)
|
||||
|
||||
v:DrawModel()
|
||||
end
|
||||
end
|
||||
|
||||
render.SetColorModulation(1, 1, 1)
|
||||
|
||||
render.SuppressEngineLighting(false)
|
||||
|
||||
render.MaterialOverride()
|
||||
|
||||
render.SetBlend(1)
|
||||
|
||||
render.SetStencilCompareFunction(STENCIL_EQUAL)
|
||||
|
||||
if asight.ThermalScopeSimple then
|
||||
surface.SetDrawColor(255, 255, 255, 255)
|
||||
surface.DrawRect(0, 0, ScrW(), ScrH())
|
||||
end
|
||||
|
||||
DrawColorModify({
|
||||
["$pp_colour_addr"] = 0,
|
||||
["$pp_colour_addg"] = 0,
|
||||
["$pp_colour_addb"] = 0,
|
||||
["$pp_colour_brightness"] = 0,
|
||||
["$pp_colour_contrast"] = 1,
|
||||
["$pp_colour_colour"] = 0,
|
||||
["$pp_colour_mulr"] = 0,
|
||||
["$pp_colour_mulg"] = 0,
|
||||
["$pp_colour_mulb"] = 0
|
||||
})
|
||||
|
||||
DrawColorModify({
|
||||
["$pp_colour_addr"] = tvsc.r - 255,
|
||||
["$pp_colour_addg"] = tvsc.g - 255,
|
||||
["$pp_colour_addb"] = tvsc.b - 255,
|
||||
["$pp_colour_addr"] = 0,
|
||||
["$pp_colour_addg"] = 0,
|
||||
["$pp_colour_addb"] = 0,
|
||||
["$pp_colour_brightness"] = 0,
|
||||
["$pp_colour_contrast"] = 1,
|
||||
["$pp_colour_colour"] = 1,
|
||||
["$pp_colour_mulr"] = 0,
|
||||
["$pp_colour_mulg"] = 0,
|
||||
["$pp_colour_mulb"] = 0
|
||||
})
|
||||
|
||||
if !asight.ThermalNoCC then
|
||||
render.SetStencilCompareFunction(STENCIL_NOTEQUAL)
|
||||
render.SetStencilPassOperation(STENCIL_KEEP)
|
||||
|
||||
if !asight.ThermalFullColor then
|
||||
DrawColorModify({
|
||||
["$pp_colour_addr"] = 0,
|
||||
["$pp_colour_addg"] = 0,
|
||||
["$pp_colour_addb"] = 0,
|
||||
["$pp_colour_brightness"] = 0,
|
||||
["$pp_colour_contrast"] = 1,
|
||||
["$pp_colour_colour"] = 0,
|
||||
["$pp_colour_mulr"] = 0,
|
||||
["$pp_colour_mulg"] = 0,
|
||||
["$pp_colour_mulb"] = 0
|
||||
})
|
||||
end
|
||||
|
||||
if ArcCW.ConVars["thermalpp"]:GetBool() and ArcCW.ConVars["scopepp"]:GetBool() then
|
||||
-- chromatic abberation
|
||||
|
||||
render.CopyRenderTargetToTexture(render.GetScreenEffectTexture())
|
||||
|
||||
render.SetMaterial( pp_ca_base )
|
||||
render.DrawScreenQuad()
|
||||
render.SetMaterial( pp_ca_r_thermal )
|
||||
render.DrawScreenQuad()
|
||||
render.SetMaterial( pp_ca_g_thermal )
|
||||
render.DrawScreenQuad()
|
||||
render.SetMaterial( pp_ca_b_thermal )
|
||||
render.DrawScreenQuad()
|
||||
-- pasted here cause otherwise either target colors will get fucked either pp either motion blur
|
||||
end
|
||||
|
||||
DrawColorModify({
|
||||
["$pp_colour_addr"] = nvsc.r - 255,
|
||||
["$pp_colour_addg"] = nvsc.g - 255,
|
||||
["$pp_colour_addb"] = nvsc.b - 255,
|
||||
-- ["$pp_colour_addr"] = 0,
|
||||
-- ["$pp_colour_addg"] = 0,
|
||||
-- ["$pp_colour_addb"] = 0,
|
||||
["$pp_colour_brightness"] = asight.Brightness or 0.1,
|
||||
["$pp_colour_contrast"] = asight.Contrast or 0.5,
|
||||
["$pp_colour_colour"] = asight.Colormult or 1,
|
||||
["$pp_colour_mulr"] = 0,
|
||||
["$pp_colour_mulg"] = 0,
|
||||
["$pp_colour_mulb"] = 0
|
||||
})
|
||||
end
|
||||
|
||||
render.SetScissorRect( sx, sy, sx + sw, sy + sh, false )
|
||||
|
||||
render.SetStencilEnable(false)
|
||||
|
||||
colormod:SetTexture("$fbtexture", render.GetScreenEffectTexture())
|
||||
|
||||
cam.End3D()
|
||||
|
||||
if ArcCW.ConVars["thermalpp"]:GetBool() then
|
||||
if !render.SupportsPixelShaders_2_0() then return end
|
||||
|
||||
DrawSharpen(0.3,0.9)
|
||||
DrawBloom(0,0.3,5,5,3,0.5,1,1,1)
|
||||
-- DrawMotionBlur(0.7,1,1/(asight.FPSLock or 45)) -- upd i changed order and it fucking worked lmao //////i cant fucking understand why motionblur fucks render target
|
||||
end
|
||||
|
||||
render.PopRenderTarget()
|
||||
end
|
||||
|
||||
function SWEP:FormNightVision(tex)
|
||||
local asight = self:GetActiveSights()
|
||||
|
||||
local orig = colormod:GetTexture("$fbtexture")
|
||||
|
||||
colormod:SetTexture("$fbtexture", tex)
|
||||
|
||||
render.PushRenderTarget(tex)
|
||||
|
||||
local nvsc = asight.NVScopeColor or greenColor
|
||||
|
||||
if !asight.NVFullColor then
|
||||
DrawColorModify({
|
||||
["$pp_colour_addr"] = 0,
|
||||
["$pp_colour_addg"] = 0,
|
||||
["$pp_colour_addb"] = 0,
|
||||
["$pp_colour_brightness"] = 0,
|
||||
["$pp_colour_contrast"] = 1,
|
||||
["$pp_colour_colour"] = 0,
|
||||
["$pp_colour_mulr"] = 0,
|
||||
["$pp_colour_mulg"] = 0,
|
||||
["$pp_colour_mulb"] = 0
|
||||
})
|
||||
end
|
||||
|
||||
DrawColorModify({
|
||||
["$pp_colour_addr"] = nvsc.r - 255,
|
||||
["$pp_colour_addg"] = nvsc.g - 255,
|
||||
["$pp_colour_addb"] = nvsc.b - 255,
|
||||
["$pp_colour_brightness"] = asight.Brightness or -0.05,
|
||||
["$pp_colour_contrast"] = asight.Contrast or 4,
|
||||
["$pp_colour_colour"] = 1,
|
||||
["$pp_colour_mulr"] = 0,
|
||||
["$pp_colour_mulg"] = 0,
|
||||
["$pp_colour_mulb"] = 0
|
||||
})
|
||||
|
||||
render.PopRenderTarget()
|
||||
|
||||
colormod:SetTexture("$fbtexture", orig)
|
||||
end
|
||||
|
||||
local pp_cc_tab = {
|
||||
["$pp_colour_addr"] = 0,
|
||||
["$pp_colour_addg"] = 0,
|
||||
["$pp_colour_addb"] = 0,
|
||||
["$pp_colour_brightness"] = 0, -- why nothing works hh
|
||||
["$pp_colour_contrast"] = 0.9, -- but same time chroma dont work without calling it
|
||||
["$pp_colour_colour"] = 1,
|
||||
["$pp_colour_mulr"] = 0,
|
||||
["$pp_colour_mulg"] = 0,
|
||||
["$pp_colour_mulb"] = 0
|
||||
}
|
||||
|
||||
function SWEP:FormPP(tex)
|
||||
if !render.SupportsPixelShaders_2_0() then return end
|
||||
|
||||
local asight = self:GetActiveSights()
|
||||
|
||||
if asight.Thermal then return end -- eyah
|
||||
|
||||
local cs = ArcCW.ConVars["cheapscopes"]:GetBool()
|
||||
local refract = ArcCW.ConVars["scopepp_refract"]:GetBool()
|
||||
local pp = ArcCW.ConVars["scopepp"]:GetBool()
|
||||
|
||||
|
||||
if refract or pp then
|
||||
if !cs then render.PushRenderTarget(tex) end
|
||||
render.CopyRenderTargetToTexture(render.GetScreenEffectTexture())
|
||||
|
||||
if pp then
|
||||
render.SetMaterial( pp_ca_base )
|
||||
render.DrawScreenQuad()
|
||||
render.SetMaterial( pp_ca_r )
|
||||
render.DrawScreenQuad()
|
||||
render.SetMaterial( pp_ca_g )
|
||||
render.DrawScreenQuad()
|
||||
render.SetMaterial( pp_ca_b )
|
||||
render.DrawScreenQuad()
|
||||
-- Color modify
|
||||
|
||||
DrawColorModify( pp_cc_tab )
|
||||
-- Sharpen
|
||||
DrawSharpen(-0.1, 5) -- dont work for some reason
|
||||
end
|
||||
|
||||
if refract then
|
||||
local addads = math.Clamp(additionalFOVconvar:GetFloat(), -2, 14)
|
||||
local refractratio = ArcCW.ConVars["scopepp_refract_ratio"]:GetFloat() or 0
|
||||
local refractamount = (-0.6 + addads / 30) * refractratio
|
||||
local refractmat = cs and matRefract_cheap or matRefract
|
||||
|
||||
refractmat:SetFloat( "$refractamount", refractamount )
|
||||
|
||||
render.SetMaterial(refractmat)
|
||||
render.DrawScreenQuad()
|
||||
end
|
||||
|
||||
if !cs then render.PopRenderTarget() end
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:FormCheapScope()
|
||||
local screen = render.GetRenderTarget()
|
||||
|
||||
render.CopyTexture( screen, rtmat_spare )
|
||||
|
||||
render.PushRenderTarget(screen)
|
||||
cam.Start3D(EyePos(), EyeAngles(), nil, nil, nil, nil, nil, 0, nil)
|
||||
ArcCW.LaserBehavior = true
|
||||
self:DoLaser(false)
|
||||
ArcCW.LaserBehavior = false
|
||||
cam.End3D()
|
||||
|
||||
self:FormPP(screen)
|
||||
|
||||
render.PopRenderTarget()
|
||||
|
||||
-- so, in order to avoid the fact that copying RTs doesn't transfer depth buffer data, we just take the screen texture and...
|
||||
-- redraw it to cover up the thermal scope stuff. Don't think too hard about this. You have plenty of VRAM.
|
||||
|
||||
local asight = self:GetActiveSights()
|
||||
|
||||
if asight.Thermal then
|
||||
self:FormThermalImaging(screen)
|
||||
end
|
||||
|
||||
if asight.SpecialScopeFunction then
|
||||
asight.SpecialScopeFunction(screen)
|
||||
end
|
||||
|
||||
-- integrated render delay for better optimization
|
||||
if asight.FPSLock then
|
||||
asight.fpsdelay = CurTime() + 1 / (asight.FPSLock or 45)
|
||||
end
|
||||
|
||||
render.CopyTexture( screen, rtmat_cheap )
|
||||
|
||||
render.DrawTextureToScreen(rtmat_spare)
|
||||
|
||||
render.UpdateFullScreenDepthTexture()
|
||||
end
|
||||
|
||||
function SWEP:FormRTScope()
|
||||
local asight = self:GetActiveSights()
|
||||
|
||||
if !asight then return end
|
||||
|
||||
if !asight.MagnifiedOptic then return end
|
||||
|
||||
local mag = asight.ScopeMagnification
|
||||
|
||||
cam.Start3D()
|
||||
|
||||
ArcCW.Overdraw = true
|
||||
ArcCW.LaserBehavior = true
|
||||
ArcCW.VMInRT = true
|
||||
|
||||
local rtangles, rtpos, rtdrawvm
|
||||
|
||||
if self:GetState() == ArcCW.STATE_SIGHTS then
|
||||
if ArcCW.ConVars["drawbarrel"]:GetBool() and ArcCW.ConVars["vm_coolsway"]:GetBool() and asight.Slot and asight.Slot == 1 then -- slot check to ignore integrated
|
||||
rtangles = self.VMAng - self.VMAngOffset - (self:GetOurViewPunchAngles() * mag * 0.1)
|
||||
rtangles.x = rtangles.x - self.VMPosOffset_Lerp.z * 10
|
||||
rtangles.y = rtangles.y + self.VMPosOffset_Lerp.y * 10
|
||||
|
||||
rtpos = self.VMPos + self.VMAng:Forward() * (asight.EVPos.y + 7 + (asight.ScopeMagnificationMax and asight.ScopeMagnificationMax / 3 or asight.HolosightData.HolosightMagnification / 3)) -- eh
|
||||
rtdrawvm = true
|
||||
else
|
||||
rtangles = EyeAngles()
|
||||
rtpos = EyePos()
|
||||
rtdrawvm = false
|
||||
|
||||
-- HACK HACK HACK HACK HACK
|
||||
-- If we do not draw the viewmodel in RT scope, calling GetAttachment on the vm seems to break LHIK.
|
||||
-- So... just draw it! The results gets drawn over again so it doesn't affect the outcome
|
||||
render.RenderView({drawviewmodel = true}) -- ?????
|
||||
end
|
||||
end
|
||||
|
||||
local addads = math.Clamp(additionalFOVconvar:GetFloat(), -2, 14)
|
||||
|
||||
local rt = {
|
||||
w = rtsize,
|
||||
h = rtsize,
|
||||
angles = rtangles,
|
||||
origin = rtpos,
|
||||
drawviewmodel = rtdrawvm,
|
||||
fov = self:GetOwner():GetFOV() / mag / 1.2 - (addads or 0) / 4,
|
||||
}
|
||||
|
||||
rtsize = ScrH()
|
||||
|
||||
if ScrH() > ScrW() then rtsize = ScrW() end
|
||||
|
||||
local rtres = asight.ForceLowRes and ScrH() * 0.6 or ScrH() -- we can emit low res lcd displays for scopes
|
||||
|
||||
rtmat = GetRenderTarget("arccw_rtmat" .. rtres, rtres, rtres, false)
|
||||
|
||||
render.PushRenderTarget(rtmat, 0, 0, rtsize, rtsize)
|
||||
|
||||
render.ClearRenderTarget(rt, blackColor)
|
||||
|
||||
if self:GetState() == ArcCW.STATE_SIGHTS then
|
||||
render.RenderView(rt)
|
||||
cam.Start3D(EyePos(), EyeAngles(), rt.fov, 0, 0, nil, nil, 0, nil)
|
||||
self:DoLaser(false)
|
||||
cam.End3D()
|
||||
end
|
||||
|
||||
ArcCW.Overdraw = false
|
||||
ArcCW.LaserBehavior = false
|
||||
ArcCW.VMInRT = false
|
||||
|
||||
self:FormPP(rtmat)
|
||||
|
||||
render.PopRenderTarget()
|
||||
|
||||
cam.End3D()
|
||||
|
||||
if asight.Thermal then
|
||||
self:FormThermalImaging(rtmat)
|
||||
end
|
||||
|
||||
if asight.SpecialScopeFunction then
|
||||
asight.SpecialScopeFunction(rtmat)
|
||||
end
|
||||
|
||||
-- integrated render delay for better optimization
|
||||
if asight.FPSLock then
|
||||
asight.fpsdelay = CurTime() + 1 / (asight.FPSLock or 45)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
-- local fpsdelay = CurTime()
|
||||
|
||||
hook.Add("RenderScene", "ArcCW", function()
|
||||
if ArcCW.ConVars["cheapscopes"]:GetBool() then return end
|
||||
|
||||
local wpn = LocalPlayer():GetActiveWeapon()
|
||||
|
||||
if !wpn.ArcCW then return end
|
||||
if wpn:GetActiveSights() and wpn:GetActiveSights().FPSLock
|
||||
and (wpn:GetActiveSights().fpsdelay or 0) > CurTime() then
|
||||
return
|
||||
end
|
||||
wpn:FormRTScope()
|
||||
end)
|
||||
|
||||
local black = Material("arccw/hud/black.png")
|
||||
local defaultdot = Material("arccw/hud/hit_dot.png")
|
||||
|
||||
function SWEP:DrawHolosight(hs, hsm, hsp, asight)
|
||||
-- holosight structure
|
||||
-- holosight model
|
||||
|
||||
local ref = 32
|
||||
|
||||
asight = asight or self:GetActiveSights()
|
||||
local delta = self:GetSightDelta()
|
||||
|
||||
if asight.HolosightData then
|
||||
hs = asight.HolosightData
|
||||
end
|
||||
|
||||
if self:GetState() != ArcCW.STATE_SIGHTS and delta > 0.5 or self:GetBarrelNearWall() > 0 then return end
|
||||
|
||||
if !hs then return end
|
||||
|
||||
if delta != 0 and ArcCW.ConVars["scopepp"]:GetBool() then
|
||||
pp_ca_r:SetVector("$color2", Vector(1-delta, 0, 0))
|
||||
pp_ca_g:SetVector("$color2", Vector(0, 1-delta, 0))
|
||||
pp_ca_b:SetVector("$color2", Vector(0, 0, 1-delta))
|
||||
pp_ca_base:SetFloat("$alpha", 1-delta)
|
||||
end
|
||||
|
||||
local hsc = Color(255, 255, 255) -- putting here global or white local SOMEHOW FUCKS IT EVEN GLOBAL BEING FUCKED WTF I HATE
|
||||
|
||||
if hs.Colorable then
|
||||
hsc.r = ArcCW.ConVars["scope_r"]:GetInt()
|
||||
hsc.g = ArcCW.ConVars["scope_g"]:GetInt()
|
||||
hsc.b = ArcCW.ConVars["scope_b"]:GetInt()
|
||||
else
|
||||
hsc = hs.HolosightColor or hsc
|
||||
end
|
||||
|
||||
local attid = 0
|
||||
|
||||
if hsm then
|
||||
|
||||
attid = hsm:LookupAttachment(asight.HolosightBone or hs.HolosightBone or "holosight")
|
||||
|
||||
if attid == 0 then
|
||||
attid = hsm:LookupAttachment("holosight")
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
local ret, pos, ang
|
||||
|
||||
if attid != 0 then
|
||||
|
||||
ret = hsm:GetAttachment(attid)
|
||||
pos = ret.Pos
|
||||
ang = ret.Ang
|
||||
|
||||
else
|
||||
|
||||
pos = EyePos()
|
||||
ang = EyeAngles()
|
||||
|
||||
end
|
||||
|
||||
local hsmag = asight.ScopeMagnification or 1
|
||||
|
||||
local size = hs.HolosightSize or 1
|
||||
|
||||
local addads = math.Clamp(additionalFOVconvar:GetFloat(), -2, 14)
|
||||
|
||||
local addconvar = asight.MagnifiedOptic and (addads or 0) or 0
|
||||
|
||||
size = size + addconvar + (addconvar > 5.5 and (addconvar-5.5) * 2 or 0)
|
||||
|
||||
|
||||
-- if asight.NightVision then
|
||||
|
||||
if hsmag and hsmag > 1 and delta < 1 and asight.NVScope then
|
||||
local screen = rtmat
|
||||
|
||||
if ArcCW.ConVars["cheapscopes"]:GetBool() then
|
||||
screen = rtmat_cheap
|
||||
end
|
||||
|
||||
if asight.NVScope then
|
||||
self:FormNightVision(screen)
|
||||
end
|
||||
end
|
||||
|
||||
render.UpdateScreenEffectTexture()
|
||||
render.ClearStencil()
|
||||
render.SetStencilEnable(true)
|
||||
render.SetStencilCompareFunction(STENCIL_ALWAYS)
|
||||
render.SetStencilPassOperation(STENCIL_REPLACE)
|
||||
render.SetStencilFailOperation(STENCIL_KEEP)
|
||||
render.SetStencilZFailOperation(STENCIL_REPLACE)
|
||||
render.SetStencilWriteMask(255)
|
||||
render.SetStencilTestMask(255)
|
||||
|
||||
render.SetBlend(0)
|
||||
|
||||
render.SetStencilReferenceValue(ref)
|
||||
|
||||
ArcCW.Overdraw = true
|
||||
|
||||
render.OverrideDepthEnable( true, true )
|
||||
|
||||
if !hsm then
|
||||
hsp:DrawModel()
|
||||
else
|
||||
|
||||
hsm:SetBodygroup(1, 0)
|
||||
|
||||
if !hsp or hs.HolosightNoHSP then
|
||||
hsm:DrawModel()
|
||||
end
|
||||
|
||||
-- render.MaterialOverride()
|
||||
|
||||
render.SetStencilReferenceValue(0)
|
||||
|
||||
hsm:SetBodygroup(1, 1)
|
||||
-- hsm:SetSubMaterial(0, "dev/no_pixel_write")
|
||||
hsm:DrawModel()
|
||||
-- hsm:SetSubMaterial()
|
||||
hsm:SetBodygroup(1, 0)
|
||||
|
||||
-- local vm = self:GetOwner():GetViewModel()
|
||||
|
||||
-- ArcCW.Overdraw = true
|
||||
-- vm:DrawModel()
|
||||
|
||||
-- ArcCW.Overdraw = false
|
||||
|
||||
render.SetStencilReferenceValue(ref)
|
||||
|
||||
if hsp then
|
||||
hsp:DrawModel()
|
||||
end
|
||||
end
|
||||
|
||||
-- render.MaterialOverride()
|
||||
|
||||
render.OverrideDepthEnable( false, true )
|
||||
|
||||
ArcCW.Overdraw = false
|
||||
|
||||
render.SetBlend(1)
|
||||
|
||||
render.SetStencilPassOperation(STENCIL_REPLACE)
|
||||
render.SetStencilCompareFunction(STENCIL_EQUAL)
|
||||
|
||||
-- local pos = EyePos()
|
||||
-- local ang = EyeAngles()
|
||||
|
||||
ang:RotateAroundAxis(ang:Forward(), -90)
|
||||
|
||||
local dir = ang:Up()
|
||||
|
||||
local pdiff = (pos - EyePos()):Length()
|
||||
|
||||
pos = LerpVector(delta, EyePos(), pos)
|
||||
|
||||
local eyeangs = self:GetOwner():EyeAngles() - self:GetOurViewPunchAngles() * hsmag * 0.1
|
||||
|
||||
-- local vm = hsm or hsp
|
||||
|
||||
-- eyeangs = eyeangs + (eyeangs - vm:GetAngles())
|
||||
|
||||
dir = LerpVector(delta, eyeangs:Forward(), dir:GetNormalized())
|
||||
|
||||
pdiff = Lerp(delta, pdiff, 0)
|
||||
|
||||
local d = (8 + pdiff)
|
||||
|
||||
d = hs.HolosightConstDist or d
|
||||
|
||||
local vmscale = (self.Attachments[asight.Slot] or {}).VMScale or Vector(1, 1, 1)
|
||||
|
||||
if hs.HolosightConstDist then
|
||||
vmscale = Vector(1, 1, 1)
|
||||
end
|
||||
|
||||
local hsx = vmscale[2] or 1
|
||||
local hsy = vmscale[3] or 1
|
||||
|
||||
pos = pos + (dir * d)
|
||||
|
||||
local pos2 = pos + (dir * -8)
|
||||
|
||||
local a = self:GetOwner():InVehicle() and {x = ScrW() / 2, y = ScrH() / 2} or pos:ToScreen()
|
||||
local x = a.x - (self.VMAngOffset.y - self.VMPosOffset_Lerp.y * 10) * (hsmag * 1.5) ^ 2
|
||||
local y = a.y + (self.VMAngOffset.x * 5 + self.VMPosOffset_Lerp.z * 10) * (hsmag * 1.5) ^ 2
|
||||
|
||||
local a2 = self:GetOwner():InVehicle() and {x = ScrW() / 2, y = ScrH() / 2} or pos2:ToScreen()
|
||||
|
||||
local off_x = a2.x - (ScrW() / 2)
|
||||
local off_y = a2.y - (ScrH() / 2)
|
||||
|
||||
--pos = pos + Vector(ArcCW.StrafeTilt(self), 0, 0)
|
||||
|
||||
-- local corner1, corner2, corner3, corner4
|
||||
|
||||
-- corner2 = pos + (ang:Right() * (-0.5 * size)) + (ang:Forward() * (0.5 * size))
|
||||
-- corner1 = pos + (ang:Right() * (-0.5 * size)) + (ang:Forward() * (-0.5 * size))
|
||||
-- corner4 = pos + (ang:Right() * (0.5 * size)) + (ang:Forward() * (-0.5 * size))
|
||||
-- corner3 = pos + (ang:Right() * (0.5 * size)) + (ang:Forward() * (0.5 * size))
|
||||
|
||||
-- render.SetColorMaterialIgnoreZ()
|
||||
-- render.DrawScreenQuad()
|
||||
|
||||
-- render.SetStencilEnable( false )
|
||||
-- local fovmag = asight.Magnification or 1
|
||||
|
||||
if hsmag and hsmag > 1 and delta < 1 then
|
||||
local screen = rtmat
|
||||
|
||||
-- local sw2 = ScrH()
|
||||
-- local sh2 = sw2
|
||||
|
||||
-- local sx2 = (ScrW() - sw2) / 2
|
||||
-- local sy2 = (ScrH() - sh2) / 2
|
||||
|
||||
-- render.SetScissorRect( sx2, sy2, sx2 + sw2, sy2 + sh2, true )
|
||||
|
||||
if render.GetHDREnabled() and delta < 0.07 then
|
||||
render.SetToneMappingScaleLinear(Vector(1,1,1)) -- hdr fix
|
||||
end
|
||||
|
||||
if ArcCW.ConVars["cheapscopes"]:GetBool() then
|
||||
|
||||
screen = rtmat_cheap
|
||||
|
||||
local addads = math.Clamp(additionalFOVconvar:GetFloat(), -2, 14)
|
||||
local csratio = math.Clamp(GetConVar("arccw_cheapscopesv2_ratio"):GetFloat(), 0, 1)
|
||||
|
||||
local ssmag = 1 + csratio * hsmag + (addads or 0) / 20 -- idk why 20
|
||||
local sw = ScrW() * ssmag
|
||||
local sh = ScrH() * ssmag
|
||||
|
||||
-- local sx = -(sw - ScrW()) / 2
|
||||
-- local sy = -(sh - ScrH()) / 2
|
||||
|
||||
local cpos = self:GetOwner():EyePos() + ((EyeAngles() + (self:GetOurViewPunchAngles() * 0.5)):Forward() * 2048)
|
||||
|
||||
--cpos:Rotate(Angle(0, -ArcCW.StrafeTilt(self), 0))
|
||||
|
||||
local ts = self:GetOwner():InVehicle() and {x = ScrW() / 2, y = ScrH() / 2} or cpos:ToScreen()
|
||||
|
||||
local sx = ts.x - (sw / 2) - off_x - (self.VMAngOffset.y - self.VMPosOffset_Lerp.y * 15) * (hsmag * 1) ^ 2
|
||||
local sy = ts.y - (sh / 2) - off_y + (self.VMAngOffset.x * 5 + self.VMPosOffset_Lerp.z * 15) * (hsmag * 1) ^ 2
|
||||
|
||||
render.SetMaterial(black)
|
||||
render.DrawScreenQuad()
|
||||
|
||||
render.DrawTextureToScreenRect(screen, sx, sy, sw, sh)
|
||||
|
||||
else
|
||||
|
||||
local sw = ScrH()
|
||||
local sh = sw
|
||||
|
||||
local sx = ((ScrW() - sw) / 2) - off_x
|
||||
local sy = ((ScrH() - sh) / 2) - off_x
|
||||
|
||||
render.SetMaterial(black)
|
||||
render.DrawScreenQuad()
|
||||
|
||||
render.DrawTextureToScreenRect(screen, sx, sy, sw, sh)
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
-- cam.Start3D()
|
||||
|
||||
-- render.SetColorMaterialIgnoreZ()
|
||||
-- render.DrawScreenQuad()
|
||||
|
||||
-- render.DrawQuad( corner1, corner2, corner3, corner4, hsc or hs.HolosightColor )
|
||||
cam.IgnoreZ( true )
|
||||
|
||||
render.SetStencilReferenceValue(ref)
|
||||
|
||||
-- render.SetMaterial(hs.HolosightReticle or defaultdot)
|
||||
-- render.DrawSprite( pos, size * hsx, size * hsy, hsc or Color(255, 255, 255) )
|
||||
-- if !hs.HolosightNoFlare then
|
||||
-- render.SetMaterial(hs.HolosightFlare or hs.HolosightReticle or defaultdot)
|
||||
-- local hss = 0.75
|
||||
-- if hs.HolosightFlare then
|
||||
-- hss = 1
|
||||
-- end
|
||||
-- render.DrawSprite( pos, size * hss * hsx, size * hss * hsy, Color(255, 255, 255, 255) )
|
||||
-- end
|
||||
|
||||
cam.Start2D()
|
||||
|
||||
if hs.HolosightBlackbox then
|
||||
render.SetStencilPassOperation(STENCIL_KEEP)
|
||||
|
||||
surface.SetDrawColor(0, 0, 0, 255 * delta)
|
||||
surface.DrawRect(0, 0, ScrW(), ScrH())
|
||||
end
|
||||
|
||||
render.SetStencilPassOperation(STENCIL_DECR)
|
||||
render.SetStencilCompareFunction(STENCIL_EQUAL)
|
||||
|
||||
local hss = size * 32 * math.min(ScrW(), ScrH()) / 800
|
||||
|
||||
--local thej = self.TheJ.anga + LocalPlayer():GetViewPunchAngles() + self:GetOurViewPunchAngles()
|
||||
-- AYE, UR ACTIVE ANG BEIN TWISTED DUNT GIVE AUH SHET
|
||||
|
||||
surface.SetMaterial(hs.HolosightReticle or defaultdot)
|
||||
surface.SetDrawColor(hsc or 255, 255, 255)
|
||||
-- surface.DrawTexturedRect(x - (hss / 2), y - (hss / 2), hss, hss)
|
||||
|
||||
DrawTexturedRectRotatedPoint(x, y, hss, hss, -(self.VMAngOffset.r+self.VMAngOffset_Lerp.r+self:GetOurViewPunchAngles().r)*5 , 0, 0)
|
||||
|
||||
if !hs.HolosightNoFlare then
|
||||
render.SetStencilPassOperation(STENCIL_KEEP)
|
||||
render.SetStencilReferenceValue(ref - 1)
|
||||
surface.SetMaterial(hs.HolosightFlare or hs.HolosightReticle or defaultdot)
|
||||
surface.SetDrawColor(255, 255, 255, 150)
|
||||
|
||||
local hss2 = hss
|
||||
|
||||
if !hs.HolosightFlare then
|
||||
hss2 = hss - 2
|
||||
end
|
||||
|
||||
surface.DrawTexturedRect(x - (hss2 / 2), y - (hss2 / 2), hss2, hss2)
|
||||
--surface.DrawTexturedRectRotated(x, y, hss2, hss2, -thej.r or 0)
|
||||
|
||||
render.SetStencilReferenceValue(ref)
|
||||
end
|
||||
|
||||
if hs.HolosightBlackbox then
|
||||
-- render.SetColorMaterialIgnoreZ()
|
||||
-- render.DrawScreenQuad()
|
||||
|
||||
surface.SetDrawColor(0, 0, 0)
|
||||
surface.DrawRect(0, 0, ScrW(), ScrH())
|
||||
-- surface.DrawRect(0, (ScrH() - hss) / 2, ScrW(), (ScrH() - hss) / 2)
|
||||
end
|
||||
|
||||
cam.End2D()
|
||||
|
||||
render.SetStencilEnable( false )
|
||||
|
||||
cam.IgnoreZ( false )
|
||||
|
||||
-- cam.End3D()
|
||||
|
||||
if hsp then
|
||||
|
||||
cam.IgnoreZ(true)
|
||||
|
||||
if ArcCW.ConVars["glare"]:GetBool() then
|
||||
render.SetBlend(delta + 0.1)
|
||||
else
|
||||
render.SetBlend(delta)
|
||||
end
|
||||
hsp:DrawModel()
|
||||
render.SetBlend(1)
|
||||
|
||||
cam.IgnoreZ( false )
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- I wanted to make here procedural normal map for refract using rt but steamsnooze
|
||||
|
||||
|
||||
-- local TEX_SIZE = 512
|
||||
|
||||
-- local tex = GetRenderTarget( "ExampleRT", TEX_SIZE, TEX_SIZE )
|
||||
|
||||
-- local txBackground = surface.GetTextureID( "pp/arccw/lense_nrm2" )
|
||||
-- local myMat = CreateMaterial( "ExampleRTMat3", "UnlitGeneric", {
|
||||
-- ["$basetexture"] = tex:GetName() -- Make the material use our render target texture
|
||||
-- } )
|
||||
|
||||
-- hook.Add( "HUDPaint", "DrawExampleMat", function()
|
||||
-- render.PushRenderTarget( tex )
|
||||
-- cam.Start2D()
|
||||
|
||||
-- surface.SetDrawColor( 128,128,255 )
|
||||
-- surface.DrawRect(0,0,TEX_SIZE, TEX_SIZE)
|
||||
-- surface.SetDrawColor( color_white )
|
||||
-- surface.SetTexture( txBackground )
|
||||
-- local joke = math.sin(CurTime()*5)/4
|
||||
|
||||
-- surface.DrawTexturedRect( TEX_SIZE/4-joke/2, TEX_SIZE/4-joke/2, TEX_SIZE/2+joke, TEX_SIZE/2+joke )
|
||||
|
||||
-- cam.End2D()
|
||||
-- render.PopRenderTarget()
|
||||
-- surface.SetDrawColor( color_white )
|
||||
-- surface.SetMaterial( myMat )
|
||||
-- surface.DrawTexturedRect( 25, 25, TEX_SIZE, TEX_SIZE )
|
||||
-- print()
|
||||
-- DrawTexturedRectRotatedPoint(250+250/2,250+250/2,250,250,(CurTime()%360)*50,0,0)
|
||||
-- surface.DrawRect(250,250,250,250)
|
||||
|
||||
-- end )
|
||||
Reference in New Issue
Block a user