mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
Upload
This commit is contained in:
169
lua/includes/modules/halo.lua
Normal file
169
lua/includes/modules/halo.lua
Normal file
@@ -0,0 +1,169 @@
|
||||
--[[
|
||||
| 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 )
|
||||
Reference in New Issue
Block a user