--[[
| 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
