Update highlighter.lua to use the newer halo.Render implementation

- Fixes flickering with advanced colour entities or other scenarios
This commit is contained in:
vlazed 2025-01-02 18:14:11 -06:00
parent c48b53e03b
commit 3ac3f0b335

View File

@ -1,8 +1,9 @@
-- Most taken from lua/includes/modules/halo.lua
local matColor = Material( "model_color" )
-- https://github.com/Facepunch/garrysmod/blob/e47ac049d026f922867ee3adb2c4746fb1244300/garrysmod/lua/includes/modules/halo.lua#L38
-- local matColor = Material( "model_color" )
local mat_Copy = Material( "pp/copy" )
local mat_Add = Material( "pp/add" )
local mat_Sub = Material( "pp/sub" )
-- local mat_Sub = Material( "pp/sub" )
local rt_Stencil = render.GetBloomTex0()
local rt_Store = render.GetScreenEffectTexture( 0 )
local function RenderHalo(entities)
@ -20,105 +21,68 @@ local function RenderHalo(entities)
-- Write to the stencil..
cam.Start3D( EyePos(), EyeAngles() )
-- cam.IgnoreZ( entry.IgnoreZ )
cam.IgnoreZ( false )
render.OverrideDepthEnable( true, false ) -- Don't write depth
render.SetStencilEnable( true )
render.SetStencilFailOperation( STENCILOPERATION_KEEP )
render.SetStencilZFailOperation( STENCILOPERATION_KEEP )
render.SetStencilPassOperation( STENCILOPERATION_REPLACE )
render.SetStencilCompareFunction( STENCILCOMPARISONFUNCTION_ALWAYS )
render.SetStencilWriteMask( 1 )
render.SetStencilReferenceValue( 1 )
render.SuppressEngineLighting(true)
cam.IgnoreZ( false )
render.SetBlend( 0 ) -- don't render any colour
render.SetStencilWriteMask( 1 )
render.SetStencilTestMask( 1 )
render.SetStencilReferenceValue( 1 )
render.PushFlashlightMode( true )
for entity, _ in pairs(entities) do
if IsValid(entity) then
entity:DrawModel()
end
end
render.PopFlashlightMode()
render.SetStencilCompareFunction( STENCILCOMPARISONFUNCTION_ALWAYS )
render.SetStencilPassOperation( STENCILOPERATION_REPLACE )
render.SetStencilFailOperation( STENCILOPERATION_KEEP )
render.SetStencilZFailOperation( STENCILOPERATION_KEEP )
cam.End3D()
for entity, _ in pairs(entities) do
if IsValid(entity) then
entity:DrawModel()
end
end
-- FILL COLOUR
-- Write to the colour buffer
cam.Start3D( EyePos(), EyeAngles() )
render.SetStencilCompareFunction( STENCILCOMPARISONFUNCTION_EQUAL )
render.SetStencilPassOperation( STENCILOPERATION_KEEP )
render.MaterialOverride( matColor )
cam.IgnoreZ( false );
cam.Start2D()
surface.SetDrawColor(0, 255, 0)
surface.DrawRect(0, 0, ScrW(), ScrH())
cam.End2D()
render.SetStencilEnable( true )
render.SetStencilWriteMask( 0 )
render.SetStencilReferenceValue( 0 )
render.SetStencilTestMask( 1 )
render.SetStencilFailOperation( STENCILOPERATION_KEEP )
render.SetStencilPassOperation( STENCILOPERATION_KEEP )
render.SetStencilZFailOperation( STENCILOPERATION_KEEP )
render.SetStencilCompareFunction( STENCILCOMPARISONFUNCTION_NOTEQUAL )
render.SetColorModulation(0, 1, 0)
render.SetBlend(1)
for entity, _ in pairs(entities) do
if IsValid(entity) then
entity:DrawModel()
end
end
render.MaterialOverride(nil)
render.SuppressEngineLighting(false)
render.SetStencilEnable(false)
cam.End3D()
-- BLUR IT
render.CopyRenderTargetToTexture( rt_Stencil )
render.OverrideDepthEnable( false, false )
render.SetStencilEnable( false );
render.BlurRenderTarget( rt_Stencil, 2, 2, 1 )
-- Put our scene back
render.SetRenderTarget( OldRT )
render.SetColorModulation( 1, 1, 1 )
render.SetStencilEnable( false )
render.OverrideDepthEnable( true, false )
render.SetBlend( 1 )
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 IT TO THE SCEEN
render.SetStencilEnable( true )
render.SetStencilWriteMask( 0 )
render.SetStencilReferenceValue( 0 )
render.SetStencilTestMask( 1 )
render.SetStencilFailOperation( STENCILOPERATION_KEEP )
render.SetStencilPassOperation( STENCILOPERATION_KEEP )
render.SetStencilZFailOperation( STENCILOPERATION_KEEP )
render.SetStencilCompareFunction( STENCILCOMPARISONFUNCTION_EQUAL )
mat_Add:SetTexture( "$basetexture", rt_Stencil )
render.SetMaterial( mat_Add )
render.SetStencilCompareFunction( STENCILCOMPARISONFUNCTION_NOTEQUAL )
for i=0, 2 do
render.DrawScreenQuad()
end
mat_Add:SetTexture( "$basetexture", rt_Stencil )
render.SetMaterial( mat_Add )
for i=0, 2 do
render.DrawScreenQuad()
end
render.SetStencilEnable( false )
-- PUT EVERYTHING BACK HOW WE FOUND IT
render.SetStencilWriteMask( 0 )
render.SetStencilReferenceValue( 0 )
render.SetStencilTestMask( 0 )
render.SetStencilEnable( false )
render.OverrideDepthEnable( false )
render.SetBlend( 1 )
cam.IgnoreZ( false )
end