2014-10-02 08:49:54 +08:00
|
|
|
-- This rewrites a few drawing methods to be slightly faster.
|
|
|
|
-- This file is to be included before everything else.
|
|
|
|
|
|
|
|
-- WARNING: Removes the functionality of any drawing functions returning values (except GetFontHeight).
|
|
|
|
-- This doesn't really matter in most cases because A: nobody uses it and B: they were returning wrong values most of the time anyway.
|
|
|
|
|
|
|
|
if SERVER or BuffedFPS then return end
|
|
|
|
BuffedFPS = true
|
|
|
|
|
2018-05-02 06:32:59 +08:00
|
|
|
local function empty() end
|
|
|
|
|
2014-10-02 08:49:54 +08:00
|
|
|
local surface = surface
|
|
|
|
local Color = Color
|
|
|
|
local color_white = color_white
|
|
|
|
|
2018-05-02 06:32:59 +08:00
|
|
|
--local TEXT_ALIGN_LEFT = 0
|
2014-10-02 08:49:54 +08:00
|
|
|
local TEXT_ALIGN_CENTER = 1
|
|
|
|
local TEXT_ALIGN_RIGHT = 2
|
2018-05-02 06:32:59 +08:00
|
|
|
--local TEXT_ALIGN_TOP = 3
|
2014-10-02 08:49:54 +08:00
|
|
|
local TEXT_ALIGN_BOTTOM = 4
|
|
|
|
|
|
|
|
local surface_SetFont = surface.SetFont
|
|
|
|
local surface_GetTextSize = surface.GetTextSize
|
|
|
|
local surface_SetTextPos = surface.SetTextPos
|
|
|
|
local surface_SetTextColor = surface.SetTextColor
|
|
|
|
local surface_DrawText = surface.DrawText
|
|
|
|
local surface_SetTexture = surface.SetTexture
|
|
|
|
local surface_SetDrawColor = surface.SetDrawColor
|
|
|
|
local surface_DrawRect = surface.DrawRect
|
|
|
|
local surface_DrawTexturedRect = surface.DrawTexturedRect
|
|
|
|
local surface_DrawTexturedRectRotated = surface.DrawTexturedRectRotated
|
|
|
|
local surface_GetTextureID = surface.GetTextureID
|
|
|
|
|
|
|
|
local string_sub = string.sub
|
|
|
|
|
|
|
|
local math_ceil = math.ceil
|
|
|
|
|
|
|
|
local Tex_Corner8 = surface_GetTextureID( "gui/corner8" )
|
|
|
|
local Tex_Corner16 = surface_GetTextureID( "gui/corner16" )
|
|
|
|
local Tex_white = surface_GetTextureID( "vgui/white" )
|
|
|
|
|
|
|
|
|
|
|
|
-- Just an FYI that this is around 450 times faster than using surface.GetTextSize when cached.
|
|
|
|
local CachedFontHeights = {}
|
|
|
|
local function draw_GetFontHeight(font)
|
|
|
|
if CachedFontHeights[font] then
|
2018-05-02 06:32:59 +08:00
|
|
|
return CachedFontHeights[font]
|
2014-10-02 08:49:54 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
surface_SetFont(font)
|
2018-05-02 06:32:59 +08:00
|
|
|
local _, h = surface_GetTextSize("W")
|
2014-10-02 08:49:54 +08:00
|
|
|
CachedFontHeights[font] = h
|
|
|
|
|
|
|
|
return h
|
|
|
|
end
|
|
|
|
|
|
|
|
local function draw_SimpleText(text, font, x, y, colour, xalign, yalign)
|
|
|
|
surface_SetFont(font)
|
|
|
|
|
|
|
|
if xalign == TEXT_ALIGN_CENTER then
|
2018-05-02 06:32:59 +08:00
|
|
|
local w, _ = surface_GetTextSize( text )
|
2014-10-02 08:49:54 +08:00
|
|
|
x = x - w / 2
|
|
|
|
elseif xalign == TEXT_ALIGN_RIGHT then
|
2018-05-02 06:32:59 +08:00
|
|
|
local w, _ = surface_GetTextSize( text )
|
2014-10-02 08:49:54 +08:00
|
|
|
x = x - w
|
|
|
|
end
|
|
|
|
|
|
|
|
if yalign == TEXT_ALIGN_CENTER then
|
|
|
|
local h = draw_GetFontHeight(font)
|
|
|
|
y = y - h / 2
|
|
|
|
elseif yalign == TEXT_ALIGN_BOTTOM then
|
|
|
|
local h = draw_GetFontHeight(font)
|
|
|
|
y = y - h
|
|
|
|
end
|
|
|
|
|
|
|
|
surface_SetTextPos(x, y)
|
|
|
|
if colour then
|
|
|
|
surface_SetTextColor(colour.r, colour.g, colour.b, colour.a)
|
|
|
|
else
|
|
|
|
surface_SetTextColor(255, 255, 255, 255)
|
|
|
|
end
|
|
|
|
surface_DrawText(text)
|
|
|
|
end
|
|
|
|
|
|
|
|
local function draw_DrawText(text, font, x, y, colour, xalign )
|
|
|
|
local curX = x
|
|
|
|
local curY = y
|
|
|
|
local curString = ""
|
2018-05-02 06:32:59 +08:00
|
|
|
|
2014-10-02 08:49:54 +08:00
|
|
|
surface_SetFont(font)
|
|
|
|
local lineHeight = draw_GetFontHeight(font)
|
2018-05-02 06:32:59 +08:00
|
|
|
|
2014-10-02 08:49:54 +08:00
|
|
|
for i=1, #text do
|
|
|
|
local ch = string_sub(text, i, i)
|
|
|
|
if ch == "\n" then
|
|
|
|
if #curString > 0 then
|
|
|
|
draw_SimpleText(curString, font, curX, curY, colour, xalign)
|
|
|
|
end
|
2018-05-02 06:32:59 +08:00
|
|
|
|
2014-10-02 08:49:54 +08:00
|
|
|
curY = curY + lineHeight / 2
|
|
|
|
curX = x
|
|
|
|
curString = ""
|
|
|
|
elseif ch == "\t" then
|
|
|
|
if #curString > 0 then
|
|
|
|
draw_SimpleText(curString, font, curX, curY, colour, xalign)
|
|
|
|
end
|
2018-05-02 06:32:59 +08:00
|
|
|
local tmpSizeX, _ = surface_GetTextSize(curString)
|
2014-10-02 08:49:54 +08:00
|
|
|
curX = math_ceil( (curX + tmpSizeX) / 50 ) * 50
|
|
|
|
curString = ""
|
|
|
|
else
|
|
|
|
curString = curString .. ch
|
|
|
|
end
|
2018-05-02 06:32:59 +08:00
|
|
|
end
|
2014-10-02 08:49:54 +08:00
|
|
|
if #curString > 0 then
|
|
|
|
draw_SimpleText(curString, font, curX, curY, colour, xalign)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local function draw_RoundedBox(bordersize, x, y, w, h, color)
|
|
|
|
surface_SetDrawColor(color)
|
|
|
|
|
|
|
|
surface_DrawRect(x + bordersize, y, w - bordersize * 2, h)
|
|
|
|
surface_DrawRect(x, y + bordersize, bordersize, h - bordersize * 2)
|
|
|
|
surface_DrawRect(x + w - bordersize, y + bordersize, bordersize, h - bordersize * 2)
|
|
|
|
|
|
|
|
surface_SetTexture(bordersize > 8 and Tex_Corner16 or Tex_Corner8)
|
2018-05-02 06:32:59 +08:00
|
|
|
surface_DrawTexturedRectRotated( x + bordersize/2 , y + bordersize/2, bordersize, bordersize, 0 )
|
|
|
|
surface_DrawTexturedRectRotated( x + w - bordersize/2 , y + bordersize/2, bordersize, bordersize, 270 )
|
2014-10-02 08:49:54 +08:00
|
|
|
surface_DrawTexturedRectRotated( x + bordersize/2 , y + h -bordersize/2, bordersize, bordersize, 90 )
|
2018-05-02 06:32:59 +08:00
|
|
|
surface_DrawTexturedRectRotated( x + w - bordersize/2 , y + h - bordersize/2, bordersize, bordersize, 180 )
|
2014-10-02 08:49:54 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
local function draw_Text(tab)
|
|
|
|
local text = tab.text
|
|
|
|
local font = tab.font or "DermaDefault"
|
|
|
|
local x = tab.pos[1] or 0
|
|
|
|
local y = tab.pos[2] or 0
|
|
|
|
local xalign = tab.xalign
|
|
|
|
local yalign = tab.yalign
|
|
|
|
|
|
|
|
surface_SetFont(font)
|
|
|
|
|
|
|
|
if xalign == TEXT_ALIGN_CENTER then
|
2018-05-02 06:32:59 +08:00
|
|
|
local w, _ = surface_GetTextSize( text )
|
2014-10-02 08:49:54 +08:00
|
|
|
x = x - w / 2
|
|
|
|
elseif xalign == TEXT_ALIGN_RIGHT then
|
2018-05-02 06:32:59 +08:00
|
|
|
local w, _ = surface_GetTextSize( text )
|
2014-10-02 08:49:54 +08:00
|
|
|
x = x - w
|
|
|
|
end
|
|
|
|
|
|
|
|
if yalign == TEXT_ALIGN_CENTER then
|
|
|
|
local h = draw_GetFontHeight(font)
|
|
|
|
y = y - h / 2
|
|
|
|
end
|
|
|
|
|
|
|
|
surface_SetTextPos(x, y)
|
|
|
|
|
|
|
|
if tab.color then
|
|
|
|
surface_SetTextColor(tab.color)
|
|
|
|
else
|
|
|
|
surface_SetTextColor(255, 255, 255, 255)
|
|
|
|
end
|
|
|
|
|
|
|
|
surface_DrawText(text)
|
|
|
|
end
|
|
|
|
|
|
|
|
function draw.WordBox( bordersize, x, y, text, font, color, fontcolor )
|
|
|
|
surface_SetFont( font )
|
|
|
|
local w, h = surface_GetTextSize( text )
|
2018-05-02 06:32:59 +08:00
|
|
|
|
2014-10-02 08:49:54 +08:00
|
|
|
draw_RoundedBox( bordersize, x, y, w+bordersize*2, h+bordersize*2, color )
|
|
|
|
|
|
|
|
surface_SetTextColor( fontcolor.r, fontcolor.g, fontcolor.b, fontcolor.a )
|
|
|
|
surface_SetTextPos( x + bordersize, y + bordersize )
|
|
|
|
surface_DrawText( text )
|
|
|
|
end
|
|
|
|
|
|
|
|
function draw.TextShadow( tab, distance, alpha )
|
|
|
|
|
|
|
|
alpha = alpha or 200
|
|
|
|
|
|
|
|
local color = tab.color
|
|
|
|
local pos = tab.pos
|
|
|
|
tab.color = Color( 0, 0, 0, alpha )
|
|
|
|
tab.pos = { pos[1] + distance, pos[2] + distance }
|
|
|
|
|
|
|
|
draw_Text( tab )
|
2018-05-02 06:32:59 +08:00
|
|
|
|
2014-10-02 08:49:54 +08:00
|
|
|
tab.color = color
|
|
|
|
tab.pos = pos
|
2018-05-02 06:32:59 +08:00
|
|
|
|
2014-10-02 08:49:54 +08:00
|
|
|
draw_Text( tab )
|
|
|
|
end
|
|
|
|
|
|
|
|
function draw.TexturedQuad(tab)
|
|
|
|
surface_SetTexture(tab.texture)
|
|
|
|
surface_SetDrawColor(tab.color or color_white)
|
|
|
|
surface_DrawTexturedRect(tab.x, tab.y, tab.w, tab.h)
|
|
|
|
end
|
|
|
|
|
|
|
|
function draw.NoTexture()
|
|
|
|
surface_SetTexture( Tex_white )
|
|
|
|
end
|
|
|
|
|
|
|
|
function draw.RoundedBoxEx( bordersize, x, y, w, h, color, a, b, c, d )
|
|
|
|
surface_SetDrawColor(color)
|
2018-05-02 06:32:59 +08:00
|
|
|
|
2014-10-02 08:49:54 +08:00
|
|
|
-- Draw as much of the rect as we can without textures
|
|
|
|
surface_DrawRect(x + bordersize, y, w - bordersize * 2, h)
|
|
|
|
surface_DrawRect(x, y + bordersize, bordersize, h - bordersize * 2)
|
|
|
|
surface_DrawRect(x + w - bordersize, y + bordersize, bordersize, h - bordersize * 2)
|
|
|
|
|
|
|
|
surface_SetTexture(bordersize > 8 and Tex_Corner16 or Tex_Corner8)
|
|
|
|
|
|
|
|
if a then
|
2018-05-02 06:32:59 +08:00
|
|
|
surface_DrawTexturedRectRotated( x + bordersize/2 , y + bordersize/2, bordersize, bordersize, 0 )
|
2014-10-02 08:49:54 +08:00
|
|
|
else
|
|
|
|
surface_DrawRect( x, y, bordersize, bordersize )
|
|
|
|
end
|
2018-05-02 06:32:59 +08:00
|
|
|
|
2014-10-02 08:49:54 +08:00
|
|
|
if b then
|
2018-05-02 06:32:59 +08:00
|
|
|
surface_DrawTexturedRectRotated( x + w - bordersize/2 , y + bordersize/2, bordersize, bordersize, 270 )
|
2014-10-02 08:49:54 +08:00
|
|
|
else
|
|
|
|
surface_DrawRect( x + w - bordersize, y, bordersize, bordersize )
|
|
|
|
end
|
2018-05-02 06:32:59 +08:00
|
|
|
|
2014-10-02 08:49:54 +08:00
|
|
|
if c then
|
|
|
|
surface_DrawTexturedRectRotated( x + bordersize/2 , y + h -bordersize/2, bordersize, bordersize, 90 )
|
|
|
|
else
|
|
|
|
surface_DrawRect( x, y + h - bordersize, bordersize, bordersize )
|
|
|
|
end
|
2018-05-02 06:32:59 +08:00
|
|
|
|
2014-10-02 08:49:54 +08:00
|
|
|
if d then
|
|
|
|
surface_DrawTexturedRectRotated( x + w - bordersize/2 , y + h - bordersize/2, bordersize, bordersize, 180 )
|
|
|
|
else
|
|
|
|
surface_DrawRect( x + w - bordersize, y + h - bordersize, bordersize, bordersize )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function draw.SimpleTextOutlined(text, font, x, y, colour, xalign, yalign, outlinewidth, outlinecolour)
|
|
|
|
local steps = (outlinewidth*2) / 3
|
|
|
|
if steps < 1 then steps = 1 end
|
2018-05-02 06:32:59 +08:00
|
|
|
|
2014-10-02 08:49:54 +08:00
|
|
|
for _x=-outlinewidth, outlinewidth, steps do
|
|
|
|
for _y=-outlinewidth, outlinewidth, steps do
|
|
|
|
draw_SimpleText(text, font, x + _x, y + _y, outlinecolour, xalign, yalign)
|
|
|
|
end
|
|
|
|
end
|
2018-05-02 06:32:59 +08:00
|
|
|
|
2014-10-02 08:49:54 +08:00
|
|
|
draw_SimpleText(text, font, x, y, colour, xalign, yalign)
|
|
|
|
end
|
|
|
|
|
|
|
|
draw.GetFontHeight = draw_GetFontHeight
|
|
|
|
draw.SimpleText = draw_SimpleText
|
|
|
|
draw.DrawText = draw_DrawText
|
|
|
|
draw.RoundedBox = draw_RoundedBox
|
|
|
|
draw.Text = draw_Text
|
2018-05-02 06:32:59 +08:00
|
|
|
|
|
|
|
-- These were EXTREMELY unoptimized functions, especially mouthmove
|
|
|
|
local SpeakFlexes = {
|
|
|
|
["jaw_drop"] = true,
|
|
|
|
["right_part"] = true,
|
|
|
|
["left_part"] = true,
|
|
|
|
["right_mouth_drop"] = true,
|
|
|
|
["left_mouth_drop"] = true
|
|
|
|
}
|
|
|
|
local GESTURE_SLOT_VCD = GESTURE_SLOT_VCD
|
|
|
|
local ACT_GMOD_IN_CHAT = ACT_GMOD_IN_CHAT
|
|
|
|
hook.Add("Initialize", "InstallFunctions", function()
|
|
|
|
function GAMEMODE:MouthMoveAnimation( pl )
|
|
|
|
if pl:IsSpeaking() then
|
|
|
|
pl.m_bWasSpeaking = true
|
|
|
|
|
|
|
|
local FlexNum = pl:GetFlexNum() - 1
|
|
|
|
if FlexNum <= 0 then return end
|
|
|
|
local weight = math.Clamp(pl:VoiceVolume() * 2, 0, 2)
|
|
|
|
for i = 0, FlexNum - 1 do
|
|
|
|
if SpeakFlexes[pl:GetFlexName(i)] then
|
|
|
|
pl:SetFlexWeight(i, weight)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
elseif pl.m_bWasSpeaking then
|
|
|
|
pl.m_bWasSpeaking = false
|
|
|
|
|
|
|
|
local FlexNum = pl:GetFlexNum() - 1
|
|
|
|
if FlexNum <= 0 then return end
|
|
|
|
for i = 0, FlexNum - 1 do
|
|
|
|
if SpeakFlexes[pl:GetFlexName(i)] then
|
|
|
|
pl:SetFlexWeight( i, 0 )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function GAMEMODE:GrabEarAnimation(pl)
|
|
|
|
if pl:IsTyping() then
|
|
|
|
pl.ChatGestureWeight = math.Approach(pl.ChatGestureWeight or 0, 1, FrameTime() * 5)
|
|
|
|
elseif pl.ChatGestureWeight and pl.ChatGestureWeight > 0 then
|
|
|
|
pl.ChatGestureWeight = math.Approach(pl.ChatGestureWeight, 0, FrameTime() * 5)
|
|
|
|
if pl.ChatGestureWeight == 0 then
|
|
|
|
pl.ChatGestureWeight = nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
if pl.ChatGestureWeight then
|
|
|
|
if pl:IsPlayingTaunt() then return end -- Don't show this when we're playing a taunt!
|
|
|
|
|
|
|
|
pl:AnimRestartGesture(GESTURE_SLOT_VCD, ACT_GMOD_IN_CHAT, true)
|
|
|
|
pl:AnimSetGestureWeight(GESTURE_SLOT_VCD, pl.ChatGestureWeight)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
|
|
|
|
drive.Move = empty
|
|
|
|
drive.FinishMove = empty
|
|
|
|
drive.StartMove = empty
|