new post | browse code | authors | help | about

LuaBin 2.0

Viewing file root / lua / vgui / FingerPoser.lua

  1.  
  2. local PANEL = {}
  3.  
  4. local MatBackground = surface.GetTextureID( "vgui/hand" )
  5.  
  6. local ow = 310
  7. local oh = 270
  8.  
  9. local FingerPositions = {
  10.                                                         { 56 / ow, 230 / oh },
  11.                                                         { 51 / ow, 180 / oh },
  12.                                                         { 59 / ow, 130 / oh },
  13.                                                        
  14.                                                         { 121 / ow, 114 / oh },
  15.                                                         { 132 / ow, 75 / oh },
  16.                                                         { 160 / ow, 34 / oh },
  17.                                                        
  18.                                                         { 165 / ow, 126 / oh },
  19.                                                         { 178 / ow, 92 / oh },
  20.                                                         { 197 / ow, 60 / oh},
  21.                                                        
  22.                                                         { 194 / ow, 156 / oh },
  23.                                                         { 208 / ow, 124 / oh },
  24.                                                         { 228 / ow, 92 / oh},
  25.                                                        
  26.                                                         { 229 / ow, 175 / oh},
  27.                                                         { 244 / ow, 146 / oh},
  28.                                                         { 259 / ow, 115 / oh},
  29.                                                 }
  30.  
  31. /*---------------------------------------------------------
  32.    Name: Init
  33. ---------------------------------------------------------*/
  34. function PANEL:Init()
  35.  
  36.         self.Hand = 0
  37.         self.FingerVars = {}
  38.        
  39.         for i=0, 14 do
  40.        
  41.                 if ( self.NumVars == 18 && i > 10 ) then break end
  42.        
  43.                 self.FingerVars[ i ] = vgui.Create( "FingerVar", self )
  44.                
  45.                 self.FingerVars[ i ]:SetVarName( "finger_"..i )
  46.                
  47.                 if ( i > 2 && i%3 != 0 ) then
  48.                
  49.                         self.FingerVars[ i ]:SetRestrictX( true )
  50.                
  51.                 end
  52.        
  53.         end
  54.  
  55. end
  56.  
  57.  
  58. /*---------------------------------------------------------
  59.    Name: ControlValues
  60.    Desc: The keyvalues passed from the control defs
  61. ---------------------------------------------------------*/
  62. function PANEL:ControlValues( kv )
  63.  
  64.         if ( kv.hand == 1 ) then
  65.                 self.Label:SetText( "#Right Hand" )
  66.                 self.Hand = 1
  67.         else
  68.                 self.Label:SetText( "#Left Hand" )
  69.                 self.Hand = 0
  70.         end
  71.        
  72.         self.NumVars = kv.numvars
  73.        
  74.         // Mitten Hand, remove the last 6 vars
  75.         if ( self.NumVars == "18" ) then
  76.        
  77.                 for i=9, 14 do
  78.                
  79.                         self.FingerVars[ i ]:Remove()
  80.                         self.FingerVars[ i ] = nil
  81.                
  82.                 end
  83.        
  84.         end
  85.        
  86.         self:InvalidateLayout( true )
  87.  
  88. end
  89.  
  90. /*---------------------------------------------------------
  91.    Name: PerformLayout
  92. ---------------------------------------------------------*/
  93. function PANEL:PerformLayout()
  94.  
  95.         local y = self.BaseClass.PerformLayout( self )
  96.        
  97.         y = y + 200
  98.         y = y + 5
  99.        
  100.         local w, h = self:GetSize()
  101.        
  102.         for finger = 0, 4 do
  103.        
  104.                 for var = 0, 2 do
  105.                
  106.                         local ID =  ((finger*3) + var)
  107.                
  108.                         local Pos = FingerPositions[ ID + 1 ]
  109.                         if ( Pos && self.FingerVars[ ID ] ) then
  110.                                 self.FingerVars[ ID ]:SetPos( Pos[1] * w - 24, Pos[2] * h - 24 )
  111.                         end
  112.                
  113.                 end
  114.        
  115.         end
  116.  
  117.         self:SetTall( y )
  118.  
  119. end
  120.  
  121.  
  122.  
  123. /*---------------------------------------------------------
  124.    Name: Paint
  125. ---------------------------------------------------------*/
  126. function PANEL:Paint()
  127.  
  128.         local w, h = self:GetSize()
  129.  
  130.         surface.SetTexture( MatBackground )
  131.         surface.SetDrawColor( 255, 255, 255, 255 )
  132.         surface.DrawTexturedRect( 0, 0, w, h )
  133.        
  134.         return true
  135.  
  136. end
  137.  
  138. /*---------------------------------------------------------
  139.    Name: Think
  140. ---------------------------------------------------------*/
  141. function PANEL:Think()
  142.         self:UpdateHovered()
  143. end
  144.  
  145. /*---------------------------------------------------------
  146.    Name: UpdateHovered
  147. ---------------------------------------------------------*/
  148. function PANEL:UpdateHovered()
  149.  
  150.         if ( self.Dragging ) then return end
  151.        
  152.         local x, y = self:CursorPos()
  153.  
  154.         local distance = 256
  155.         local hovered = nil
  156.         for k, v in pairs( self.FingerVars ) do
  157.        
  158.                 local val = v:GetValue()
  159.                 local AddX = val[1] * v:GetWide()
  160.                 local AddY = val[2] * v:GetTall()
  161.        
  162.                 local dist = math.Distance( x, y, v.x + v:GetWide()/2 + AddX, v.y + v:GetTall()/2 + AddY )
  163.                 if ( dist < distance ) then
  164.                         hovered = v
  165.                         distance = dist
  166.                 end
  167.        
  168.         end
  169.        
  170.         if ( !hovered || hovered != self.HoveredPanel ) then
  171.                
  172.                 if ( IsValid( self.HoveredPanel ) ) then
  173.                         self.HoveredPanel.HoveredFingerVar = nil
  174.                 end
  175.                
  176.                 self.HoveredPanel = hovered
  177.                
  178.                 if ( IsValid( self.HoveredPanel ) ) then
  179.                         self.HoveredPanel.HoveredFingerVar = true
  180.                 end
  181.        
  182.         end
  183.  
  184. end
  185.  
  186. /*---------------------------------------------------------
  187.    Name: OnMousePressed
  188. ---------------------------------------------------------*/
  189. function PANEL:OnMousePressed( mousecode )
  190.  
  191.         self:UpdateHovered()
  192.        
  193.         if ( !IsValid( self.HoveredPanel ) ) then return end
  194.        
  195.         self.HoveredPanel:OnMousePressed( mousecode )
  196.        
  197. end
  198.  
  199. vgui.Register( "FingerPoser", PANEL, "ContextBase" )