Advertisement
Guest User

Untitled

a guest
May 29th, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.88 KB | None | 0 0
  1. local segments
  2. local numCorners
  3.  
  4. local bWidth = 1
  5. local bTexCoord = 1
  6. local bColor = Color(255,255,255,255)
  7.  
  8. function render.StartBeam3D(corners)
  9.  
  10.     numCorners = math.max(corners or 3,3)
  11.  
  12.     segments = {}
  13. end
  14.  
  15. function render.AddBeam3D(pos,width,texCoord,color)
  16.  
  17.     segments[#segments+1] = {pos=pos,width=width or bWidth,texCoord=texCoord or bTexCoord,color=color or bColor}
  18. end
  19.  
  20. function render.EndBeam3D()
  21.  
  22.     local rings = {}
  23.    
  24.     for i=1,#segments-1 do
  25.    
  26.         local pos = segments[i].pos
  27.         local nextPos = segments[i+1].pos
  28.        
  29.         local dir = (nextPos-pos):GetNormal()
  30.        
  31.         rings[i] = {}
  32.        
  33.         for j=1,numCorners do
  34.        
  35.             local p = dir:Angle()
  36.            
  37.             p:RotateAroundAxis(p:Forward(),360*j/numCorners)
  38.            
  39.             p = pos+p:Right()*segments[i].width
  40.            
  41.             rings[i][j] = p
  42.         end    
  43.        
  44.         debugoverlay.Line(pos,nextPos,RealFrameTime())
  45.     end
  46.    
  47.     mesh.Begin(MATERIAL_QUADS,#segments*numCorners)
  48.    
  49.     for i=1,#segments-2 do
  50.    
  51.         local ring = rings[i]
  52.         local nextRing = rings[i+1]
  53.        
  54.         local t = segments[i+1].texCoord
  55.                
  56.         for j=1,numCorners-1 do
  57.        
  58.             local c = segments[i].color
  59.             local c2 = segments[i+1].color
  60.                
  61.             local p = ring[j]
  62.             local p2 = ring[j+1]
  63.             local p3 = nextRing[j+1]
  64.             local p4 = nextRing[j]
  65.            
  66.             local norm = (p2-p):Cross(p3-p):GetNormal()
  67.            
  68.             mesh.Position(p4)
  69.             mesh.Normal(norm)
  70.             mesh.Color(c2.r,c2.g,c2.b,c2.a)
  71.             mesh.TexCoord(0,0,0)
  72.             mesh.AdvanceVertex()
  73.                
  74.             mesh.Position(p3)
  75.             mesh.Normal(norm)
  76.             mesh.Color(c2.r,c2.g,c2.b,c2.a)
  77.             mesh.TexCoord(0,1,0)
  78.             mesh.AdvanceVertex()
  79.                
  80.             mesh.Position(p2)
  81.             mesh.Normal(norm)
  82.             mesh.Color(c.r,c.g,c.b,c.a)
  83.             mesh.TexCoord(0,1,t)
  84.             mesh.AdvanceVertex()
  85.                
  86.             mesh.Position(p)
  87.             mesh.Normal(norm)
  88.             mesh.Color(c.r,c.g,c.b,c.a)
  89.             mesh.TexCoord(0,0,t)
  90.             mesh.AdvanceVertex()       
  91.            
  92.             debugoverlay.Line(p,p2,RealFrameTime())
  93.             debugoverlay.Line(p2,p3,RealFrameTime())
  94.             debugoverlay.Line(p,p4,RealFrameTime())        
  95.         end
  96.        
  97.         local c = segments[i].color
  98.         local c2 = segments[i+1].color
  99.                
  100.         local p = ring[numCorners]
  101.         local p2 = ring[1]
  102.         local p3 = nextRing[1]
  103.         local p4 = nextRing[numCorners]
  104.            
  105.         local norm = (p2-p):Cross(p3-p):GetNormal()
  106.            
  107.         mesh.Position(p4)
  108.         mesh.Normal(norm)
  109.         mesh.Color(c2.r,c2.g,c2.b,c2.a)
  110.         mesh.TexCoord(0,0,0)
  111.         mesh.AdvanceVertex()
  112.            
  113.         mesh.Position(p3)
  114.         mesh.Normal(norm)
  115.         mesh.Color(c2.r,c2.g,c2.b,c2.a)
  116.         mesh.TexCoord(0,1,0)
  117.         mesh.AdvanceVertex()
  118.            
  119.         mesh.Position(p2)
  120.         mesh.Normal(norm)
  121.         mesh.Color(c.r,c.g,c.b,c.a)
  122.         mesh.TexCoord(0,1,t)
  123.         mesh.AdvanceVertex()
  124.            
  125.         mesh.Position(p)
  126.         mesh.Normal(norm)
  127.         mesh.Color(c.r,c.g,c.b,c.a)
  128.         mesh.TexCoord(0,0,t)
  129.         mesh.AdvanceVertex()       
  130.            
  131.         debugoverlay.Line(p,p2,RealFrameTime())
  132.         debugoverlay.Line(p2,p3,RealFrameTime())
  133.         debugoverlay.Line(p,p4,RealFrameTime())
  134.     end
  135.    
  136.     mesh.End()
  137.    
  138.     segments = nil
  139.     numCorners = nil
  140. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement