Garry's Mod Wiki

Revision Difference

cam.PushModelMatrix#561631

<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. <note>This does not work with <page>cam.Start3D2D</page> if `multiply` is false.</note> <warning>When used in the Paint function of a panel, if you want to rely on the top-left position of the panel, you must use <page>VMatrix:Translate</page> with the (0, 0) position of the panel relative to the screen.</warning> </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> <description>Simple function to draw rotated and/or scaled text.</description> <code> local custom_vector = Vector( 1, 1, 1 ) ⤶ hook.Add("HUDPaint", "2d rotation test", function() local w, h = ScrW(), ScrH()⤶ local t = RealTime() * 50⤶ ⤶ local m = Matrix()⤶ local center = Vector( w / 2, h / 2 )⤶ ⤶ m:Translate( center )⤶ m:Rotate( Angle( 0, t, 0 ) )⤶ m:Scale( custom_vector * math.sin( t / 100 ) * 10 )⤶ m:Translate( -center )⤶ ⤶ cam.PushModelMatrix( m )⤶ 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.RotatedText( text, x, y, font, color, ang)⤶ local vector_one = Vector( 1, 1, 1 ) function draw.RotatedText( text, font, x, y, color, ang, scale ) render.PushFilterMag( TEXFILTER.ANISOTROPIC ) render.PushFilterMin( TEXFILTER.ANISOTROPIC ) local m = Matrix() m:Translate( Vector( x, y, 0 ) ) m:Rotate( Angle( 0, ang, 0 ) ) m:Scale( vector_one * ( scale or 1 ) )⤶ surface.SetFont( font ) local w, h = surface.GetTextSize( text ) m:Translate( -Vector( w / 2, h / 2, 0 ) ) m:Translate( Vector( -w / 2, -h / 2, 0 ) ) cam.PushModelMatrix( m ) draw.DrawText( text, font, 0, 0, color ) cam.PopModelMatrix() render.PopFilterMag() render.PopFilterMin() end ⤶ hook.Add("HUDPaint", "2d rotation test", function()⤶ local w, h = ScrW(), ScrH()⤶ local ang = RealTime() * 50⤶ local scale = ( math.sin( ang / 10 ) + 2 ) * 0.5⤶ draw.RotatedText( "My fancy Rotating Text", "DermaLarge", w / 2, h / 2, color_white, ang, scale )⤶ end)⤶ </code> <output>⤶ <upload src="70c/8dc53b786182f21.mp4" size="411916" name="hl2_QmJKFXNAVS.mp4" />⤶ </output>⤶ </example>