mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 05:43:46 +03:00
150 lines
3.7 KiB
Lua
150 lines
3.7 KiB
Lua
--[[
|
|
| 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/
|
|
--]]
|
|
|
|
|
|
local cl_drawspawneffect = CreateConVar( "cl_drawspawneffect", "1", { FCVAR_ARCHIVE }, "Whether to draw the spawn effect when spawning objects." )
|
|
|
|
local matRefract = Material( "models/spawn_effect" )
|
|
|
|
function EFFECT:Init( data )
|
|
|
|
if ( !cl_drawspawneffect:GetBool() ) then return end
|
|
|
|
-- This is how long the spawn effect
|
|
-- takes from start to finish.
|
|
self.Time = 0.5
|
|
self.LifeTime = CurTime() + self.Time
|
|
|
|
local ent = data:GetEntity()
|
|
|
|
if ( !IsValid( ent ) ) then return end
|
|
if ( !ent:GetModel() ) then return end
|
|
|
|
self.ParentEntity = ent
|
|
self:SetModel( ent:GetModel() )
|
|
self:SetPos( ent:GetPos() )
|
|
self:SetAngles( ent:GetAngles() )
|
|
self:SetParent( ent )
|
|
|
|
self.OldRenderOverride = self.ParentEntity.RenderOverride
|
|
self.ParentEntity.SpawnEffect = self
|
|
self.ParentEntity.RenderOverride = self.RenderParent
|
|
|
|
|
|
end
|
|
|
|
function EFFECT:Think()
|
|
|
|
if ( !cl_drawspawneffect:GetBool() ) then return false end
|
|
if ( !IsValid( self.ParentEntity ) ) then return false end
|
|
|
|
local PPos = self.ParentEntity:GetPos()
|
|
self:SetPos( PPos + ( EyePos() - PPos ):GetNormal() )
|
|
|
|
if ( self.LifeTime > CurTime() ) then
|
|
return true
|
|
end
|
|
|
|
-- Remove the override only if our override was not overridden.
|
|
if ( self.ParentEntity.RenderOverride == self.RenderParent ) then
|
|
self.ParentEntity.RenderOverride = self.OldRenderOverride
|
|
end
|
|
self.ParentEntity.SpawnEffect = nil
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
function EFFECT:Render()
|
|
end
|
|
|
|
function EFFECT:RenderOverlay( entity )
|
|
|
|
local Fraction = ( self.LifeTime - CurTime() ) / self.Time
|
|
local ColFrac = ( Fraction - 0.5 ) * 2
|
|
|
|
Fraction = math.Clamp( Fraction, 0, 1 )
|
|
ColFrac = math.Clamp( ColFrac, 0, 1 )
|
|
|
|
-- Change our model's alpha so the texture will fade out
|
|
--entity:SetColor( 255, 255, 255, 1 + 254 * (ColFrac) )
|
|
|
|
-- Place the camera a tiny bit closer to the entity.
|
|
-- It will draw a big bigger and we will skip any z buffer problems
|
|
local EyeNormal = entity:GetPos() - EyePos()
|
|
local Distance = EyeNormal:Length()
|
|
EyeNormal:Normalize()
|
|
|
|
local Pos = EyePos() + EyeNormal * Distance * 0.01
|
|
|
|
-- Start the new 3d camera position
|
|
local bClipping = self:StartClip( entity, 1.2 )
|
|
cam.Start3D( Pos, EyeAngles() )
|
|
|
|
-- If our card is DX8 or above draw the refraction effect
|
|
if ( render.GetDXLevel() >= 80 ) then
|
|
|
|
-- Update the refraction texture with whatever is drawn right now
|
|
render.UpdateRefractTexture()
|
|
|
|
matRefract:SetFloat( "$refractamount", Fraction * 0.1 )
|
|
|
|
-- Draw model with refraction texture
|
|
render.MaterialOverride( matRefract )
|
|
entity:DrawModel()
|
|
render.MaterialOverride()
|
|
|
|
end
|
|
|
|
-- Set the camera back to how it was
|
|
cam.End3D()
|
|
render.PopCustomClipPlane()
|
|
render.EnableClipping( bClipping )
|
|
|
|
end
|
|
|
|
function EFFECT:RenderParent()
|
|
|
|
if ( !IsValid( self ) ) then return end
|
|
if ( !IsValid( self.SpawnEffect ) ) then self.RenderOverride = nil return end
|
|
|
|
local bClipping = self.SpawnEffect:StartClip( self, 1 )
|
|
|
|
self:DrawModel()
|
|
|
|
render.PopCustomClipPlane()
|
|
render.EnableClipping( bClipping )
|
|
|
|
self.SpawnEffect:RenderOverlay( self )
|
|
|
|
end
|
|
|
|
function EFFECT:StartClip( model, spd )
|
|
|
|
local mn, mx = model:GetRenderBounds()
|
|
local Up = ( mx - mn ):GetNormal()
|
|
local Bottom = model:GetPos() + mn
|
|
local Top = model:GetPos() + mx
|
|
|
|
local Fraction = ( self.LifeTime - CurTime() ) / self.Time
|
|
Fraction = math.Clamp( Fraction / spd, 0, 1 )
|
|
|
|
local Lerped = LerpVector( Fraction, Bottom, Top )
|
|
|
|
local normal = Up
|
|
local distance = normal:Dot( Lerped )
|
|
|
|
local bEnabled = render.EnableClipping( true )
|
|
render.PushCustomClipPlane( normal, distance )
|
|
|
|
return bEnabled
|
|
|
|
end
|