Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local segments
- local numCorners
- local bWidth = 1
- local bTexCoord = 1
- local bColor = Color(255,255,255,255)
- function render.StartBeam3D(corners)
- numCorners = math.max(corners or 3,3)
- segments = {}
- end
- function render.AddBeam3D(pos,width,texCoord,color)
- segments[#segments+1] = {pos=pos,width=width or bWidth,texCoord=texCoord or bTexCoord,color=color or bColor}
- end
- function render.EndBeam3D()
- local rings = {}
- for i=1,#segments-1 do
- local pos = segments[i].pos
- local nextPos = segments[i+1].pos
- local dir = (nextPos-pos):GetNormal()
- rings[i] = {}
- for j=1,numCorners do
- local p = dir:Angle()
- p:RotateAroundAxis(p:Forward(),360*j/numCorners)
- p = pos+p:Right()*segments[i].width
- rings[i][j] = p
- end
- debugoverlay.Line(pos,nextPos,RealFrameTime())
- end
- mesh.Begin(MATERIAL_QUADS,#segments*numCorners)
- for i=1,#segments-2 do
- local ring = rings[i]
- local nextRing = rings[i+1]
- local t = segments[i+1].texCoord
- for j=1,numCorners-1 do
- local c = segments[i].color
- local c2 = segments[i+1].color
- local p = ring[j]
- local p2 = ring[j+1]
- local p3 = nextRing[j+1]
- local p4 = nextRing[j]
- local norm = (p2-p):Cross(p3-p):GetNormal()
- mesh.Position(p4)
- mesh.Normal(norm)
- mesh.Color(c2.r,c2.g,c2.b,c2.a)
- mesh.TexCoord(0,0,0)
- mesh.AdvanceVertex()
- mesh.Position(p3)
- mesh.Normal(norm)
- mesh.Color(c2.r,c2.g,c2.b,c2.a)
- mesh.TexCoord(0,1,0)
- mesh.AdvanceVertex()
- mesh.Position(p2)
- mesh.Normal(norm)
- mesh.Color(c.r,c.g,c.b,c.a)
- mesh.TexCoord(0,1,t)
- mesh.AdvanceVertex()
- mesh.Position(p)
- mesh.Normal(norm)
- mesh.Color(c.r,c.g,c.b,c.a)
- mesh.TexCoord(0,0,t)
- mesh.AdvanceVertex()
- debugoverlay.Line(p,p2,RealFrameTime())
- debugoverlay.Line(p2,p3,RealFrameTime())
- debugoverlay.Line(p,p4,RealFrameTime())
- end
- local c = segments[i].color
- local c2 = segments[i+1].color
- local p = ring[numCorners]
- local p2 = ring[1]
- local p3 = nextRing[1]
- local p4 = nextRing[numCorners]
- local norm = (p2-p):Cross(p3-p):GetNormal()
- mesh.Position(p4)
- mesh.Normal(norm)
- mesh.Color(c2.r,c2.g,c2.b,c2.a)
- mesh.TexCoord(0,0,0)
- mesh.AdvanceVertex()
- mesh.Position(p3)
- mesh.Normal(norm)
- mesh.Color(c2.r,c2.g,c2.b,c2.a)
- mesh.TexCoord(0,1,0)
- mesh.AdvanceVertex()
- mesh.Position(p2)
- mesh.Normal(norm)
- mesh.Color(c.r,c.g,c.b,c.a)
- mesh.TexCoord(0,1,t)
- mesh.AdvanceVertex()
- mesh.Position(p)
- mesh.Normal(norm)
- mesh.Color(c.r,c.g,c.b,c.a)
- mesh.TexCoord(0,0,t)
- mesh.AdvanceVertex()
- debugoverlay.Line(p,p2,RealFrameTime())
- debugoverlay.Line(p2,p3,RealFrameTime())
- debugoverlay.Line(p,p4,RealFrameTime())
- end
- mesh.End()
- segments = nil
- numCorners = nil
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement