mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
217 lines
5.2 KiB
Lua
217 lines
5.2 KiB
Lua
|
|
--[[
|
||
|
|
| 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()
|