• Change derma panel shape
    8 replies, posted
Hi everyone ! Basically I want to know how to change the shape of a derma panel ^^ Like it is normally a square/rectangle. Would like for example a triangle... Thanks ^^ Bye c: *EDIT* I should maybe have posted this in "Problems that don't need their own thread". Sorry.
Look into [url]http://wiki.garrysmod.com/page/PANEL/Paint[/url] and [url]http://wiki.garrysmod.com/page/surface[/url]
You could technically fake it by simply overwriting your frames Paint call and in that you draw a triangle using [URL="http://wiki.garrysmod.com/page/surface/DrawPoly"]surface.DrawPoly[/URL] [editline]METAMIST IS GAY LUL[/editline] [t]https://vgy.me/FQtdLN.jpg[/t] [lua] concommand.Add("triangle", function(ply) local w = 500 local h = 500 local frame = vgui.Create("DFrame") frame:SetSize(w, h) frame.triangle = { { x = w/2, y = 0 }, { x = w, y = h }, { x = 0, y = h } } frame:Center() frame:MakePopup() frame.Paint = function(pnl, w, h) draw.NoTexture() surface.SetDrawColor(20, 20, 20, 200) surface.DrawPoly(pnl.triangle) end end) [/lua]
[QUOTE=Klaes4Zaugen;51292731]You could technically fake it by simply overwriting your frames Paint call and in that you draw a triangle using [URL="http://wiki.garrysmod.com/page/surface/DrawPoly"]surface.DrawPoly[/URL][/QUOTE] But how do I use something like Category:AvatarImage on a surface.DrawPoly ?
[QUOTE=Traziiex;51292762]But how do I use something like Category:AvatarImage on a surface.DrawPoly ?[/QUOTE] [t]https://vgy.me/RymaD8.png[/t] [URL="http://pastebin.com/xwypWufv"]Link to pastebin where spacing aren't messed up (blame Atom.io)[/URL] [code] concommand.Add("triangle", function(ply) local w = 500 local h = 500 local frame = vgui.Create("DFrame") frame:SetSize(w, h) frame.triangle = { { x = w/2, y = 0 }, { x = w, y = h }, { x = 0, y = h } } frame:Center() frame:MakePopup() frame.Paint = function(pnl, w, h) surface.SetDrawColor(20, 20, 20) surface.DrawRect(0, 0, w, h) draw.NoTexture() surface.SetDrawColor(40, 40, 40) surface.DrawPoly(pnl.triangle) end local avatar = vgui.Create("triangleAvatar", frame); avatar:SetSize(64, 64); avatar:SetPos(w/2 - avatar:GetWide()/2, h/2 - avatar:GetTall()); avatar:SetPlayer(LocalPlayer(), 128); avatar:SetReserve(true); end) local function drawTriangle(w, h, reserve) local tbl = {} if (reserve) then tbl = { { x = 0, y = 0 }, { x = w, y = 0 }, { x = w/2, y = h } } else tbl = { { x = w/2, y = 0 }, { x = w, y = h }, { x = 0, y = h } } end surface.DrawPoly(tbl) end local PANEL = {} function PANEL:Init() self.avatar = vgui.Create( "AvatarImage", self ) self.avatar:SetPaintedManually( true ) end function PANEL:PerformLayout() self.avatar:SetSize( self:GetWide(), self:GetTall() ) end function PANEL:SetPlayer( ply, size ) self.avatar:SetPlayer( ply, size ) end function PANEL:SetReserve(bool) self.avatar.Direction = bool; end function PANEL:Paint( w, h ) render.ClearStencil() render.SetStencilEnable( true ) render.SetStencilWriteMask( 1 ) render.SetStencilTestMask( 1 ) render.SetStencilFailOperation( STENCILOPERATION_REPLACE ) render.SetStencilPassOperation( STENCILOPERATION_ZERO ) render.SetStencilZFailOperation( STENCILOPERATION_ZERO ) render.SetStencilCompareFunction( STENCILCOMPARISONFUNCTION_NEVER ) render.SetStencilReferenceValue( 1 ) draw.NoTexture() surface.SetDrawColor(color_white) drawTriangle(w, h, self.avatar.Direction); render.SetStencilFailOperation( STENCILOPERATION_ZERO ) render.SetStencilPassOperation( STENCILOPERATION_REPLACE ) render.SetStencilZFailOperation( STENCILOPERATION_ZERO ) render.SetStencilCompareFunction( STENCILCOMPARISONFUNCTION_EQUAL ) render.SetStencilReferenceValue( 1 ) self.avatar:PaintManual() render.SetStencilEnable( false ) render.ClearStencil() end vgui.Register( "triangleAvatar", PANEL ) [/code]
[QUOTE=Klaes4Zaugen;51292808][t]https://vgy.me/RymaD8.png[/t] [URL="http://pastebin.com/xwypWufv"]Link to pastebin where spacing aren't messed up (blame Atom.io)[/URL] [code] concommand.Add("triangle", function(ply) local w = 500 local h = 500 local frame = vgui.Create("DFrame") frame:SetSize(w, h) frame.triangle = { { x = w/2, y = 0 }, { x = w, y = h }, { x = 0, y = h } } frame:Center() frame:MakePopup() frame.Paint = function(pnl, w, h) surface.SetDrawColor(20, 20, 20) surface.DrawRect(0, 0, w, h) draw.NoTexture() surface.SetDrawColor(40, 40, 40) surface.DrawPoly(pnl.triangle) end local avatar = vgui.Create("triangleAvatar", frame); avatar:SetSize(64, 64); avatar:SetPos(w/2 - avatar:GetWide()/2, h/2 - avatar:GetTall()); avatar:SetPlayer(LocalPlayer(), 128); avatar:SetReserve(true); end) local function drawTriangle(w, h, reserve) local tbl = {} if (reserve) then tbl = { { x = 0, y = 0 }, { x = w, y = 0 }, { x = w/2, y = h } } else tbl = { { x = w/2, y = 0 }, { x = w, y = h }, { x = 0, y = h } } end surface.DrawPoly(tbl) end local PANEL = {} function PANEL:Init() self.avatar = vgui.Create( "AvatarImage", self ) self.avatar:SetPaintedManually( true ) end function PANEL:PerformLayout() self.avatar:SetSize( self:GetWide(), self:GetTall() ) end function PANEL:SetPlayer( ply, size ) self.avatar:SetPlayer( ply, size ) end function PANEL:SetReserve(bool) self.avatar.Direction = bool; end function PANEL:Paint( w, h ) render.ClearStencil() render.SetStencilEnable( true ) render.SetStencilWriteMask( 1 ) render.SetStencilTestMask( 1 ) render.SetStencilFailOperation( STENCILOPERATION_REPLACE ) render.SetStencilPassOperation( STENCILOPERATION_ZERO ) render.SetStencilZFailOperation( STENCILOPERATION_ZERO ) render.SetStencilCompareFunction( STENCILCOMPARISONFUNCTION_NEVER ) render.SetStencilReferenceValue( 1 ) draw.NoTexture() surface.SetDrawColor(color_white) drawTriangle(w, h, self.avatar.Direction); render.SetStencilFailOperation( STENCILOPERATION_ZERO ) render.SetStencilPassOperation( STENCILOPERATION_REPLACE ) render.SetStencilZFailOperation( STENCILOPERATION_ZERO ) render.SetStencilCompareFunction( STENCILCOMPARISONFUNCTION_EQUAL ) render.SetStencilReferenceValue( 1 ) self.avatar:PaintManual() render.SetStencilEnable( false ) render.ClearStencil() end vgui.Register( "triangleAvatar", PANEL ) [/code][/QUOTE] Thank you for this. But is there a way to just show the avatar on the HUD using surface.DrawRect (or something like that). I don't really need to have the derma. I could maybe try to hide the derme... but would be better just have a surface.Something() with the avatar on it ^^ *_EDIT_* Sorry for being annoying ! :c
The DFrame element is not required. You can remove it.
[QUOTE=Remixful;51292910]The DFrame element is not required. You can remove it.[/QUOTE] So can the player's avatar be a texture or a material ?
[t]https://vgy.me/OmGpZW.jpg[/t] Made an enhanced avatar image. Use PANEL:SetType(type [int], direction [bool]) on your enhanced avatar panel. Here's the 5 different numbers you can choose for type. 1. Hexagon 2. Triangle 3. Circle 4. Square 5. Pentagon Direction is optional, it defaults to false if not set. Panel defaults to square if you don't set anything. Only hexagon (1) and triangle (2) have support for direction. [URL="http://pastebin.com/WCuTw2W5"]Pastebin with only EnhancedAvatarImage panel[/URL] [lua] concommand.Add("triangle", function(ply) local w = 500 local h = 500 local frame = vgui.Create("DFrame") frame:SetSize(w, h) frame.triangle = { { x = w/2, y = 0 }, { x = w, y = h }, { x = 0, y = h } } frame:Center() frame:MakePopup() frame.Paint = function(pnl, w, h) surface.SetDrawColor(20, 20, 20) surface.DrawRect(0, 0, w, h) draw.NoTexture() surface.SetDrawColor(40, 40, 40) surface.DrawPoly(pnl.triangle) end local avatar = vgui.Create("EnhancedAvatarImage", frame); avatar:SetSize(128, 128); avatar:SetPos(w/2 - avatar:GetWide()/2, h/2 - avatar:GetTall()); avatar:SetPlayer(LocalPlayer(), 128); avatar:SetType(1, false); end) local PANEL = {} function PANEL:DrawHexagon(w, h) local tbl = {}; if (self.avatar.direction) then tbl = { { x = w/2, y = 0 }, { x = w, y = h/2 - h/4 }, { x = w, y = h/2 + h/4 }, { x = w/2, y = h }, { x = 0, y = h/2 + h/4 }, { x = 0, y = h/2 - h/4 } } else tbl = { { x = w/2 - w/4, y = 0 }, { x = w/2 + w/4, y = 0 }, { x = w, y = h/2 }, { x = w/2 + w/4, y = h }, { x = w/2 - w/4, y = h }, { x = 0, y = h/2 } } end surface.DrawPoly(tbl); end function PANEL:DrawTriangle(w, h) local tbl = {} if (self.avatar.direction) then tbl = { { x = 0, y = 0 }, { x = w, y = 0 }, { x = w/2, y = h } } else tbl = { { x = w/2, y = 0 }, { x = w, y = h }, { x = 0, y = h } } end surface.DrawPoly(tbl) end function PANEL:DrawCircle(w, h) local x = w/2; local y = h/2; local radius = h/2; local seg = 360; local cir = {} table.insert( cir, { x = x, y = y } ) for i = 0, seg do local a = math.rad( ( i / seg ) * -360 ) table.insert( cir, { x = x + math.sin( a ) * radius, y = y + math.cos( a ) * radius } ) end local a = math.rad( 0 ) table.insert( cir, { x = x + math.sin( a ) * radius, y = y + math.cos( a ) * radius } ) surface.DrawPoly( cir ) end function PANEL:DrawSquare(w, h) local tbl = { { x = 0, y = 0 }, { x = w, y = 0 }, { x = w, y = h }, { x = 0, y = h } } surface.DrawPoly(tbl); end function PANEL:DrawPentagon(w, h) local tbl = { { x = w/2, y = 0 }, { x = w, y = h * 0.4 }, { x = w - w/5, y = h }, { x = 0 + w/5, y = h }, { x = 0, y = h * 0.4 } } surface.DrawPoly(tbl); end function PANEL:Init() self.avatar = vgui.Create( "AvatarImage", self ) self.avatar:SetPaintedManually( true ) self.avatar.type = 4; -- default to square self.avatar.direction = false; end function PANEL:PerformLayout() self.avatar:SetSize( self:GetWide(), self:GetTall() ) end function PANEL:SetPlayer( ply, size ) self.avatar:SetPlayer( ply, size ) end function PANEL:SetType(type, direction) self.avatar.type = type; self.avatar.direction = direction; end function PANEL:GetType() local type = self.avatar.type; local direction = self.avatar.direction; return type, direction; end function PANEL:DrawPolygon(w, h) local type, direction = self:GetType(); if (type == 1) then self:DrawHexagon(w, h); end if (type == 2) then self:DrawTriangle(w, h); end if (type == 3) then self:DrawCircle(w, h); end if (type == 4) then self:DrawSquare(w, h); end if (type == 5) then self:DrawPentagon(w, h); end end function PANEL:Paint( w, h ) render.ClearStencil() render.SetStencilEnable( true ) render.SetStencilWriteMask( 1 ) render.SetStencilTestMask( 1 ) render.SetStencilFailOperation( STENCILOPERATION_REPLACE ) render.SetStencilPassOperation( STENCILOPERATION_ZERO ) render.SetStencilZFailOperation( STENCILOPERATION_ZERO ) render.SetStencilCompareFunction( STENCILCOMPARISONFUNCTION_NEVER ) render.SetStencilReferenceValue( 1 ) draw.NoTexture() surface.SetDrawColor(color_white) self:DrawPolygon(w, h); render.SetStencilFailOperation( STENCILOPERATION_ZERO ) render.SetStencilPassOperation( STENCILOPERATION_REPLACE ) render.SetStencilZFailOperation( STENCILOPERATION_ZERO ) render.SetStencilCompareFunction( STENCILCOMPARISONFUNCTION_EQUAL ) render.SetStencilReferenceValue( 1 ) self.avatar:PaintManual() render.SetStencilEnable( false ) render.ClearStencil() end vgui.Register( "EnhancedAvatarImage", PANEL ) hook.Add("HUDPaint", "mycoolhud!!!!!!", function() local scrH = ScrH(); if (!IsValid(MyHUD_Avatar)) then MyHUD_Avatar = vgui.Create("EnhancedAvatarImage"); MyHUD_Avatar:SetSize(128, 128); MyHUD_Avatar:SetPos(5, scrH/2 - MyHUD_Avatar:GetTall() / 2); MyHUD_Avatar:SetType(5, true); MyHUD_Avatar:SetPlayer(LocalPlayer(), 128); end end) [/lua]
Sorry, you need to Log In to post a reply to this thread.