Files
wnsrc/lua/pac3/core/client/base_drawable.lua

217 lines
5.2 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/
--]]
local render_OverrideAlphaWriteEnable = render.OverrideAlphaWriteEnable
local render_OverrideColorWriteEnable = render.OverrideColorWriteEnable
local render_OverrideBlendFunc = render.OverrideBlendFunc
local ProtectedCall = ProtectedCall
local cam_IgnoreZ = cam.IgnoreZ
local pac = pac
local ipairs = ipairs
local table = table
local TEXFILTER_POINT = TEXFILTER.POINT
local render_PopFilterMag = render.PopFilterMag
local render_PopFilterMin = render.PopFilterMin
local render_PushFilterMin = render.PushFilterMin
local render_PushFilterMag = render.PushFilterMag
local BUILDER, PART = pac.PartTemplate("base_movable")
PART.ClassName = "base_drawable"
PART.BaseName = PART.ClassName
BUILDER
:StartStorableVars()
:SetPropertyGroup("appearance")
:GetSet("Translucent", false)
:GetSet("IgnoreZ", false)
:GetSet("NoTextureFiltering", false)
:GetSet("BlendMode", "", {enums = {
none = "one;zero;one;zero",
alpha = "src_alpha;one_minus_src_alpha;one;one_minus_src_alpha",
multiplicative = "dst_color;zero;dst_color;zero",
premultiplied = "one;one_src_minus_alpha;one;one_src_minus_alpha",
additive = "src_alpha;one;src_alpha;one",
}})
:EndStorableVars()
do
local blend_modes = {
zero = 0,
one = 1,
dst_color = 2,
one_minus_dst_color = 3,
src_alpha = 4,
one_minus_src_alpha = 5,
dst_alpha = 6,
one_minus_dst_alpha = 7,
src_alpha_saturate = 8,
src_color = 9,
one_minus_src_color = 10,
}
function PART:SetBlendMode(str)
str = str:lower():gsub("%s+", ""):gsub(",", ";"):gsub("blend_", "")
self.BlendMode = str
local tbl = str:Split(";")
local src_color
local dst_color
local src_alpha
local dst_alpha
if tbl[1] then src_color = blend_modes[tbl[1]] end
if tbl[2] then dst_color = blend_modes[tbl[2]] end
if tbl[3] then src_alpha = blend_modes[tbl[3]] end
if tbl[4] then dst_alpha = blend_modes[tbl[4]] end
if src_color and dst_color then
self.blend_override = {src_color, dst_color, src_alpha or 0, dst_alpha or 0, tbl[5]}
else
self.blend_override = nil
end
end
function PART:StartBlend()
if self.blend_override then
render_OverrideBlendFunc(true,
self.blend_override[1],
self.blend_override[2],
self.blend_override[3],
self.blend_override[4]
)
if self.blend_override[5] then
render_OverrideAlphaWriteEnable(true, self.blend_override[5] == "write_alpha")
end
if self.blend_override[6] then
render_OverrideColorWriteEnable(true, self.blend_override[6] == "write_color")
end
end
end
function PART:StopBlend()
if self.blend_override then
render_OverrideBlendFunc(false)
if self.blend_override[5] then
render_OverrideAlphaWriteEnable(false)
end
if self.blend_override[6] then
render_OverrideColorWriteEnable(false)
end
end
end
end
do -- modifiers
PART.HandleModifiersManually = false
function PART:AddModifier(part)
self:RemoveModifier(part)
table.insert(self.modifiers, part)
end
function PART:RemoveModifier(part)
for i, v in ipairs(self.modifiers) do
if v == part then
table.remove(self.modifiers, i)
break
end
end
end
function PART:ModifiersPreEvent(event)
if not self.modifiers[1] then return end
for _, part in ipairs(self.modifiers) do
if not part:IsHidden() then
if not part.pre_draw_events then part.pre_draw_events = {} end
if not part.pre_draw_events[event] then part.pre_draw_events[event] = "Pre" .. event end
if part[part.pre_draw_events[event]] then
part[part.pre_draw_events[event]](part)
end
end
end
end
function PART:ModifiersPostEvent(event)
if not self.modifiers[1] then return end
for _, part in ipairs(self.modifiers) do
if not part:IsHidden() then
if not part.post_draw_events then part.post_draw_events = {} end
if not part.post_draw_events[event] then part.post_draw_events[event] = "Post" .. event end
if part[part.post_draw_events[event]] then
part[part.post_draw_events[event]](part)
end
end
end
end
end
function PART:IsDrawHidden()
return self.draw_hidden
end
local _self
local function call_draw()
_self:OnDraw()
end
function PART:Draw(draw_type)
if not self.OnDraw or not self.Enabled or self:IsHiddenCached() then return end
if
draw_type == "viewmodel" or draw_type == "hands" or
((self.Translucent == true or self.force_translucent == true) and draw_type == "translucent") or
((self.Translucent == false or self.force_translucent == false) and draw_type == "opaque")
then
if not self.HandleModifiersManually then self:ModifiersPreEvent('OnDraw', draw_type) end
if self.IgnoreZ then cam_IgnoreZ(true) end
self:StartBlend()
if self.NoTextureFiltering then
render_PushFilterMin(TEXFILTER_POINT)
render_PushFilterMag(TEXFILTER_POINT)
end
_self = self
ProtectedCall(call_draw)
if self.NoTextureFiltering then
render_PopFilterMin()
render_PopFilterMag()
end
self:StopBlend()
if self.IgnoreZ then cam_IgnoreZ(false) end
if not self.HandleModifiersManually then self:ModifiersPostEvent('OnDraw', draw_type) end
end
end
BUILDER:Register()