Files
wnsrc/lua/includes/modules/halo.lua

170 lines
3.8 KiB
Lua
Raw Normal View History

2024-08-04 22:55:00 +03:00
--[[
| 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/
--]]
module( "halo", package.seeall )
local mat_Copy = Material( "pp/copy" )
local mat_Add = Material( "pp/add" )
local mat_Sub = Material( "pp/sub" )
local rt_Store = render.GetScreenEffectTexture( 0 )
local rt_Blur = render.GetScreenEffectTexture( 1 )
local List = {}
local RenderEnt = NULL
function Add( entities, color, blurx, blury, passes, add, ignorez )
if ( table.IsEmpty( entities ) ) then return end
if ( add == nil ) then add = true end
if ( ignorez == nil ) then ignorez = false end
local t =
{
Ents = entities,
Color = color,
BlurX = blurx or 2,
BlurY = blury or 2,
DrawPasses = passes or 1,
Additive = add,
IgnoreZ = ignorez
}
table.insert( List, t )
end
function RenderedEntity()
return RenderEnt
end
function Render( entry )
local rt_Scene = render.GetRenderTarget()
-- Store a copy of the original scene
render.CopyRenderTargetToTexture( rt_Store )
-- Clear our scene so that additive/subtractive rendering with it will work later
if ( entry.Additive ) then
render.Clear( 0, 0, 0, 255, false, true )
else
render.Clear( 255, 255, 255, 255, false, true )
end
-- Render colored props to the scene and set their pixels high
cam.Start3D()
render.SetStencilEnable( true )
render.SuppressEngineLighting( true )
cam.IgnoreZ( entry.IgnoreZ )
render.SetStencilWriteMask( 1 )
render.SetStencilTestMask( 1 )
render.SetStencilReferenceValue( 1 )
render.SetStencilCompareFunction( STENCIL_ALWAYS )
render.SetStencilPassOperation( STENCIL_REPLACE )
render.SetStencilFailOperation( STENCIL_KEEP )
render.SetStencilZFailOperation( STENCIL_KEEP )
for k, v in pairs( entry.Ents ) do
if ( !IsValid( v ) or v:GetNoDraw() ) then continue end
RenderEnt = v
v:DrawModel()
end
RenderEnt = NULL
render.SetStencilCompareFunction( STENCIL_EQUAL )
render.SetStencilPassOperation( STENCIL_KEEP )
-- render.SetStencilFailOperation( STENCIL_KEEP )
-- render.SetStencilZFailOperation( STENCIL_KEEP )
cam.Start2D()
surface.SetDrawColor( entry.Color )
surface.DrawRect( 0, 0, ScrW(), ScrH() )
cam.End2D()
cam.IgnoreZ( false )
render.SuppressEngineLighting( false )
render.SetStencilEnable( false )
cam.End3D()
-- Store a blurred version of the colored props in an RT
render.CopyRenderTargetToTexture( rt_Blur )
render.BlurRenderTarget( rt_Blur, entry.BlurX, entry.BlurY, 1 )
-- Restore the original scene
render.SetRenderTarget( rt_Scene )
mat_Copy:SetTexture( "$basetexture", rt_Store )
mat_Copy:SetString( "$color", "1 1 1" )
mat_Copy:SetString( "$alpha", "1" )
render.SetMaterial( mat_Copy )
render.DrawScreenQuad()
-- Draw back our blured colored props additively/subtractively, ignoring the high bits
render.SetStencilEnable( true )
render.SetStencilCompareFunction( STENCIL_NOTEQUAL )
-- render.SetStencilPassOperation( STENCIL_KEEP )
-- render.SetStencilFailOperation( STENCIL_KEEP )
-- render.SetStencilZFailOperation( STENCIL_KEEP )
if ( entry.Additive ) then
mat_Add:SetTexture( "$basetexture", rt_Blur )
render.SetMaterial( mat_Add )
else
mat_Sub:SetTexture( "$basetexture", rt_Blur )
render.SetMaterial( mat_Sub )
end
for i = 0, entry.DrawPasses do
render.DrawScreenQuad()
end
render.SetStencilEnable( false )
-- Return original values
render.SetStencilTestMask( 0 )
render.SetStencilWriteMask( 0 )
render.SetStencilReferenceValue( 0 )
end
hook.Add( "PostDrawEffects", "RenderHalos", function()
hook.Run( "PreDrawHalos" )
if ( #List == 0 ) then return end
for k, v in ipairs( List ) do
Render( v )
end
List = {}
end )