Revision Difference
cam.PushModelMatrix#524933
<function name="PushModelMatrix" parent="cam" type="libraryfunc">
<description>
Pushes the specified matrix onto the render matrix stack. Unlike opengl, this will replace the current model matrix.
⤶
<bug issue="1663">This does not work with <page>cam.Start3D2D</page> in certain hooks.</bug>⤶
⤶
<note>This does not work with <page>cam.Start3D2D</page> if `multiply` is false.</note>⤶
</description>
<realm>Client</realm>
<args>
<arg name="matrix" type="VMatrix">The matrix to push.</arg>
<arg name="multiply" type="boolean" default="false">If set, multiplies given matrix with currently active matrix (<page>cam.GetModelMatrix</page>) before pushing.</arg>
</args>
</function>
<example>
<description>Rotates and scales text in the center of the screen.</description>
<code>
hook.Add("HUDPaint", "2d rotation test", function()
local w, h = ScrW(), ScrH()
local t = RealTime()*50
local mat = Matrix()
mat:Translate(Vector(w/2, h/2))
mat:Rotate(Angle(0,t,0))
mat:Scale(Vector(1,1,1) * math.sin(t/100) *10)
mat:Translate(-Vector(w/2, h/2))
cam.PushModelMatrix(mat)
surface.SetFont("DermaDefault")
surface.SetTextColor(255, 255, 255, 255)
surface.SetTextPos(w/2, h/2)
surface.DrawText("LOLLOLOLOL")
cam.PopModelMatrix()
end)
</code>
</example>
<example>
<description>Simple function to draw rotated text</description>
<code>
function draw.TextRotated(text, x, y, color, font, ang)
render.PushFilterMag(TEXFILTER.ANISOTROPIC)
render.PushFilterMin(TEXFILTER.ANISOTROPIC)
surface.SetFont(font)
surface.SetTextColor(color)
surface.SetTextPos(0, 0)
local textWidth, textHeight = surface.GetTextSize( text )
local rad = -math.rad( ang )
x = x - ( math.cos( rad ) * textWidth / 2 + math.sin( rad ) * textHeight / 2 )
y = y + ( math.sin( rad ) * textWidth / 2 + math.cos( rad ) * textHeight / 2 )
local m = Matrix()
m:SetAngles(Angle(0, ang, 0))
m:SetTranslation(Vector(x, y, 0))
cam.PushModelMatrix(m)
surface.DrawText(text)
cam.PopModelMatrix()
render.PopFilterMag()
render.PopFilterMin()
end
</code>
</example>