168 lines
4.5 KiB
Lua
168 lines
4.5 KiB
Lua
local rt_w = 240
|
|
local rt_h = 240
|
|
|
|
local rtmat = GetRenderTarget("tacrp_pipscope_thermal", rt_w, rt_h, false)
|
|
local rtmat_spare = GetRenderTarget("tacrp_pipscope_thermal2", rt_w, rt_h, false)
|
|
|
|
local lastthermalscope = false
|
|
local thermaltime = 0
|
|
|
|
local csm_boot_1 = Material("tacrp/hud/thermal_boot_1.png", "mips smooth")
|
|
|
|
local csm_1 = Material("tacrp/hud/thermal_1.png", "mips smooth")
|
|
local csm_2 = Material("tacrp/hud/thermal_2.png", "mips smooth")
|
|
|
|
local noise1 = Material("tacrp/hud/noise1.png")
|
|
local noise2 = Material("tacrp/hud/noise2.png")
|
|
local noise3 = Material("tacrp/hud/noise3.png")
|
|
local noise4 = Material("tacrp/hud/noise4.png")
|
|
|
|
local noisemats = {
|
|
noise1,
|
|
noise2,
|
|
noise3,
|
|
noise4
|
|
}
|
|
|
|
local lastrendertime = 0
|
|
|
|
local fps = 30
|
|
|
|
function SWEP:DoThermalRT()
|
|
if self:GetScopeLevel() <= 0 or !self:GetPeeking() then lastthermalscope = false return end
|
|
if TacRP.OverDraw then return end
|
|
|
|
if !lastthermalscope then
|
|
thermaltime = 0
|
|
end
|
|
|
|
if lastrendertime > CurTime() - (1 / fps) then return end
|
|
|
|
local angles = self:GetShootDir()
|
|
local origin = self:GetMuzzleOrigin()
|
|
|
|
local rt = {
|
|
x = 0,
|
|
y = 0,
|
|
w = rt_w,
|
|
h = rt_h,
|
|
aspect = 0.999,
|
|
angles = angles,
|
|
origin = origin,
|
|
drawviewmodel = false,
|
|
fov = 18.5,
|
|
znear = 6
|
|
}
|
|
|
|
render.PushRenderTarget(rtmat, 0, 0, rt_w, rt_h)
|
|
|
|
if thermaltime >= 0.75 or thermaltime == 0 then
|
|
TacRP.OverDraw = true
|
|
render.RenderView(rt)
|
|
TacRP.OverDraw = false
|
|
end
|
|
|
|
DrawColorModify({
|
|
["$pp_colour_addr"] = 0.25 * 132 / 255,
|
|
["$pp_colour_addg"] = 0.25 * 169 / 255,
|
|
["$pp_colour_addb"] = 0.25 * 154 / 255,
|
|
["$pp_colour_brightness"] = 0.7,
|
|
["$pp_colour_contrast"] = 0.75,
|
|
["$pp_colour_colour"] = 0,
|
|
["$pp_colour_mulr"] = 0,
|
|
["$pp_colour_mulg"] = 0,
|
|
["$pp_colour_mulb"] = 0
|
|
})
|
|
|
|
DrawBloom(0.25, 0.5, 16, 8, 1, 1, 1, 1, 1)
|
|
|
|
if thermaltime >= 0.75 then
|
|
local thermalents = ents.FindInCone(origin, angles:Forward(), 10000, 0.939692620) // 20 degrees
|
|
|
|
render.SuppressEngineLighting(true)
|
|
render.SetBlend(0.9)
|
|
local col = Color(255, 0, 0)
|
|
if self:GetTactical() then
|
|
col = Color(0, 255, 255)
|
|
end
|
|
render.SetColorModulation(col.r, col.g, col.b)
|
|
|
|
cam.Start3D(origin, angles, 20)
|
|
|
|
cam.IgnoreZ(false)
|
|
|
|
for _, ent in ipairs(thermalents) do
|
|
if ent == self:GetOwner() then continue end
|
|
if !ent:IsValid() or ent:IsWorld() then continue end
|
|
if ent:Health() <= 0 then continue end
|
|
if ent:IsPlayer() or ent:IsNPC() or ent:IsNextBot() or ent:IsOnFire() then
|
|
ent:DrawModel()
|
|
end
|
|
if ent:IsVehicle() or ent:IsOnFire() or ent.ArcCW_Hot or ent:IsScripted() and !ent:GetOwner():IsValid() then
|
|
ent:DrawModel()
|
|
end
|
|
end
|
|
|
|
cam.End3D()
|
|
|
|
render.SetColorModulation(1, 1, 1)
|
|
render.SuppressEngineLighting(false)
|
|
render.MaterialOverride()
|
|
render.SetBlend(1)
|
|
end
|
|
|
|
if self:GetTactical() then
|
|
render.PushRenderTarget(rtmat, 0, 0, rt_w, rt_h)
|
|
render.CopyTexture( rtmat, rtmat_spare )
|
|
|
|
render.Clear(255, 255, 255, 255, true, true)
|
|
render.OverrideBlend(true, BLEND_ONE, BLEND_ONE, BLENDFUNC_REVERSE_SUBTRACT)
|
|
|
|
render.DrawTextureToScreen(rtmat_spare)
|
|
|
|
render.OverrideBlend(false)
|
|
render.PopRenderTarget()
|
|
end
|
|
|
|
cam.Start2D()
|
|
|
|
render.ClearDepth()
|
|
|
|
if thermaltime < 0.75 then
|
|
surface.SetDrawColor(0, 0, 0)
|
|
surface.DrawRect(0, 0, rt_w, rt_h)
|
|
end
|
|
|
|
if thermaltime < 0.45 then
|
|
surface.SetMaterial(csm_boot_1)
|
|
else
|
|
if self:GetTactical() then
|
|
surface.SetMaterial(csm_1)
|
|
else
|
|
surface.SetMaterial(csm_2)
|
|
end
|
|
end
|
|
|
|
surface.SetDrawColor(255, 255, 255)
|
|
surface.DrawTexturedRect(0, 0, rt_w, rt_h)
|
|
cam.End2D()
|
|
|
|
render.PopRenderTarget()
|
|
|
|
thermaltime = thermaltime + (math.random(0, 5) * math.random(0, 5) * (1 / fps) / 6.25)
|
|
|
|
lastthermalscope = true
|
|
lastrendertime = CurTime()
|
|
end
|
|
|
|
function SWEP:DoThermalCam()
|
|
if self:GetScopeLevel() <= 0 or !self:GetPeeking() then lastthermalscope = false return end
|
|
|
|
local w = TacRP.SS(480 / 4)
|
|
local h = TacRP.SS(480 / 4)
|
|
local x = (ScrW() - w) / 2
|
|
local y = (ScrH() - h) / 2
|
|
|
|
render.DrawTextureToScreenRect(rtmat, x, y, w, h)
|
|
end
|