local PANEL 
= {}
PANEL.Init 
= function( panel )
	
panel:
SetText( 
"" )
	
panel:
SetSize( 
24, 
24 )
	panel.Dragging 
= false
end
PANEL.OnCursorMoved 
= function( panel, x, y )
	
if ( panel.Dragging ) 
then
		local x, y 
= input.
GetCursorPos()
		
panel:
SetPos( panel.StartPos.x 
+ x 
- panel.CursorPos.x , panel.StartPos.y 
+ y 
- panel.CursorPos.y )
	
end
end
PANEL.OnMousePressed 
= function( panel, x, y )
	panel.Dragging 
= true
	local x, y 
= input.
GetCursorPos()
	panel.CursorPos 
= { x 
= x, y 
= y 
}
	local x, y 
= panel:
GetPos()
	panel.StartPos 
= { x 
= x, y 
= y 
}
end
PANEL.OnMouseReleased 
= function( panel, x, y ) panel.Dragging 
= false end
PANEL.OnCursorExited 
= PANEL.OnCursorMoved 
local MovableButton 
= vgui.
RegisterTable( PANEL, 
"DButton" )
local f 
= vgui.
Create( 
"DFrame" )
f:
SetSize( 
500, 
500 )
f:
Center()
f:
MakePopup()
local oldPaint 
= f.Paint
f.Paint 
= function( pnl, w, h )
	
oldPaint( pnl, w, h )
	
local points 
= {}
	for k, pnl 
in ipairs( 
pnl:
GetChildren() ) 
do
		local x, y 
= pnl:
GetPos()
		
if ( pnl.Dragging 
!= nil ) 
then
			table.
insert( points, 
Vector( x, y, 
0 ) )
			
pnl:
SetText( 
#points )
		
end
	end
	surface.
SetDrawColor( 
255, 
0, 
0, 
255 )
	
local lastPos 
= math.
BSplinePoint( 
0, points, 
1 )
	
for i
=0, 
32 do
		local pos 
= math.
BSplinePoint( i 
/ 32, points, 
1 )
		
surface.
DrawLine( lastPos.x, lastPos.y, pos.x, pos.y )
		lastPos 
= pos
	
end
end
vgui.
CreateFromTable( MovableButton, f ):
SetPos( 
100, 
100 )
vgui.
CreateFromTable( MovableButton, f ):
SetPos( 
200, 
200 )
vgui.
CreateFromTable( MovableButton, f ):
SetPos( 
300, 
100 )
vgui.
CreateFromTable( MovableButton, f ):
SetPos( 
400, 
200 )
local addBtn 
= vgui.
Create( 
"DButton", f )
addBtn:
Dock( TOP )
addBtn:
SetText( 
"Add point" )
addBtn.DoClick 
= function() 
vgui.
CreateFromTable( MovableButton, f ):
SetPos( 
VectorRand( 
20, 
450 ):
Unpack() ) 
end