Advertisement
Guest User

VertexGraphics module (ROBLOX)

a guest
Oct 20th, 2017
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 10.93 KB | None | 0 0
  1. -- By noliCAIKS/RPFeltz, somewhere in 2014
  2.  
  3. local VertexGraphics = {}
  4. local vertexColor = BrickColor.new(Color3.new(0, 0, 0))
  5. local vertexFixed = true
  6. local vertexLocked = true
  7. local vertexMaterial = Enum.Material.Plastic
  8. local vertexSolid = false
  9. local vertexTransparency = 0
  10. local vertexTriangleOffset = 0
  11.  
  12. local function GenerateStockPart(className)
  13.     local stockPart = Instance.new(className)
  14.     stockPart.Anchored = vertexFixed
  15.     stockPart.BackSurface = "SmoothNoOutlines"
  16.     stockPart.BottomSurface = "SmoothNoOutlines"
  17.     stockPart.BrickColor = vertexColor
  18.     stockPart.CanCollide = vertexSolid
  19.     stockPart.FormFactor = "Custom"
  20.     stockPart.FrontSurface = "SmoothNoOutlines"
  21.     stockPart.LeftSurface = "SmoothNoOutlines"
  22.     stockPart.Locked = vertexLocked
  23.     stockPart.Material = vertexMaterial
  24.     stockPart.RightSurface = "SmoothNoOutlines"
  25.     stockPart.TopSurface = "SmoothNoOutlines"
  26.     stockPart.Transparency = vertexTransparency
  27.     return stockPart
  28. end
  29.  
  30. function VertexGraphics.drawLineFan(vertices, parent, thickness)
  31.     thickness = thickness or 0.2
  32.     local stockPart = GenerateStockPart("Part")
  33.     local count = #vertices
  34.     local previous = nil
  35.     local vertex1, vertex2 = vertices[1], nil
  36.     for index = 2, count do
  37.         vertex2 = vertices[index]
  38.         local offset = vertex2 - vertex1
  39.         local distance = offset.magnitude
  40.         local center = vertex1:Lerp(vertex2, 0.5)
  41.         local part = stockPart:Clone()
  42.         local mesh = Instance.new("CylinderMesh", part)
  43.         local size = Vector3.new(thickness, distance, thickness)
  44.         part.CFrame = CFrame.new(center, vertex2) * CFrame.new(0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 1, 0)
  45.         part.Size = size
  46.         mesh.Scale = size / part.Size
  47.         if not vertexFixed and previous then
  48.             JoinParts(previous, part)
  49.         end
  50.         previous = part
  51.         part.Parent = parent
  52.     end
  53.     parent.PrimaryPart = previous
  54. end
  55. function VertexGraphics.drawLineStrip(vertices, parent, thickness)
  56.     thickness = thickness or 0.2
  57.     local stockPart = GenerateStockPart("Part")
  58.     local count = #vertices
  59.     local previous = nil
  60.     local vertex1, vertex2 = nil, vertices[1]
  61.     for index = 2, count do
  62.         vertex1, vertex2 = vertex2, vertices[index]
  63.         local offset = vertex2 - vertex1
  64.         local distance = offset.magnitude
  65.         local center = vertex1:Lerp(vertex2, 0.5)
  66.         local part = stockPart:Clone()
  67.         local mesh = Instance.new("CylinderMesh", part)
  68.         local size = Vector3.new(thickness, distance, thickness)
  69.         part.CFrame = CFrame.new(center, vertex2) * CFrame.new(0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 1, 0)
  70.         part.Size = size
  71.         mesh.Scale = size / part.Size
  72.         if not vertexFixed and previous then
  73.             JoinParts(previous, part)
  74.         end
  75.         previous = part
  76.         part.Parent = parent
  77.     end
  78.     parent.PrimaryPart = previous
  79. end
  80. function VertexGraphics.drawTriangleFan(vertices, parent, thickness)
  81.     thickness = thickness or 0
  82.     local stockPart = GenerateStockPart("WedgePart")
  83.     local count = #vertices
  84.     local previous = nil
  85.     local vertexIterator1, vertexIterator2, vertexIterator3 = vertices[1], nil, vertices[2]
  86.     local offsetIterator1, offsetIterator2, offsetIterator3 = nil, nil, vertexIterator1 - vertexIterator3
  87.     local dotIterator1, dotIterator2, dotIterator3 = nil, nil, offsetIterator3:Dot(offsetIterator3)
  88.     for index = 3, count do
  89.         vertexIterator2, vertexIterator3 = vertexIterator3, vertices[index]
  90.         offsetIterator1, offsetIterator2, offsetIterator3 = -offsetIterator3, vertexIterator3 - vertexIterator2, vertexIterator1 - vertexIterator3
  91.         dotIterator1, dotIterator2, dotIterator3 = dotIterator3, offsetIterator2:Dot(offsetIterator2), offsetIterator3:Dot(offsetIterator3)
  92.         local vertex1, vertex2, vertex3
  93.         local offset1, offset2, offset3
  94.         local dot1, dot2, dot3
  95.         if dotIterator1 > dotIterator2 then
  96.             if dotIterator1 > dotIterator3 then
  97.                 vertex1, vertex2, vertex3 = vertexIterator1, vertexIterator2, vertexIterator3
  98.                 offset1, offset2, offset3 = offsetIterator1, offsetIterator2, offsetIterator3
  99.                 dot1, dot2, dot3 = dotIterator1, dotIterator2, dotIterator3
  100.             else
  101.                 vertex1, vertex2, vertex3 = vertexIterator3, vertexIterator1, vertexIterator2
  102.                 offset1, offset2, offset3 = offsetIterator3, offsetIterator1, offsetIterator2
  103.                 dot1, dot2, dot3 = dotIterator3, dotIterator1, dotIterator2
  104.             end
  105.         elseif dotIterator2 > dotIterator3 then
  106.             vertex1, vertex2, vertex3 = vertexIterator2, vertexIterator3, vertexIterator1
  107.             offset1, offset2, offset3 = offsetIterator2, offsetIterator3, offsetIterator1
  108.             dot1, dot2, dot3 = dotIterator2, dotIterator3, dotIterator1
  109.         else
  110.             vertex1, vertex2, vertex3 = vertexIterator3, vertexIterator1, vertexIterator2
  111.             offset1, offset2, offset3 = offsetIterator3, offsetIterator1, offsetIterator2
  112.             dot1, dot2, dot3 = dotIterator3, dotIterator1, dotIterator2
  113.         end
  114.         local length1 = math.sqrt(dot1)
  115.         local distanceMiddle = (dot1 + dot3 - dot2) / (2 * length1)
  116.         local offsetMiddle = vertex1:Lerp(vertex2, distanceMiddle / length1)
  117.         local offsetTop = vertex3 - offsetMiddle
  118.         local height = offsetTop.magnitude
  119.         local axisY, axisZ = offsetTop / height, offset1 / length1
  120.         local axisX = axisY:Cross(axisZ)
  121.         local size1, size2 = Vector3.new(thickness, height, distanceMiddle), Vector3.new(thickness, height, length1 - distanceMiddle)
  122.         local part1, part2 = stockPart:Clone(), stockPart:Clone()
  123.         part1.CFrame = CFrame.new(offsetMiddle.X, offsetMiddle.Y, offsetMiddle.Z, axisX.X, axisY.X, axisZ.X, axisX.Y, axisY.Y, axisZ.Y, axisX.Z, axisY.Z, axisZ.Z) * CFrame.new(-vertexTriangleOffset, height * 0.5, distanceMiddle * -0.5)
  124.         part2.CFrame = CFrame.new(offsetMiddle.X, offsetMiddle.Y, offsetMiddle.Z, -axisX.X, axisY.X, -axisZ.X, -axisX.Y, axisY.Y, -axisZ.Y, -axisX.Z, axisY.Z, -axisZ.Z) * CFrame.new(vertexTriangleOffset, height * 0.5, (distanceMiddle - length1) * 0.5)
  125.         part1.Size = size1
  126.         part2.Size = size2
  127.         local realSize1, realSize2 = part1.Size, part2.Size
  128.         if size1 ~= realSize1 or size2 ~= realSize2 then
  129.             local mesh1 = Instance.new("SpecialMesh")
  130.             mesh1.MeshType = "Wedge"
  131.             local mesh2 = mesh1:Clone()
  132.             mesh1.Scale = size1 / realSize1
  133.             mesh2.Scale = size2 / realSize2
  134.             mesh1.Parent = part1
  135.             mesh2.Parent = part2
  136.         end
  137.         if not vertexFixed then
  138.             VertexGraphics.joinParts(part1, part2)
  139.             if previous then
  140.                 VertexGraphics.joinParts(previous, part1)
  141.             end
  142.         end
  143.         previous = part1
  144.         part1.Parent = parent
  145.         part2.Parent = parent
  146.     end
  147.     parent.PrimaryPart = previous
  148. end
  149. function VertexGraphics.drawTriangleStrip(vertices, parent, thickness)
  150.     thickness = thickness or 0
  151.     local offsetMultiplier = 1
  152.     local stockPart = GenerateStockPart("WedgePart")
  153.     local count = #vertices
  154.     local previous = nil
  155.     local vertexIterator1, vertexIterator2, vertexIterator3 = nil, vertices[1], vertices[2]
  156.     local offsetIterator1, offsetIterator2, offsetIterator3 = nil, vertexIterator3 - vertexIterator2, nil
  157.     local dotIterator1, dotIterator2, dotIterator3 = nil, offsetIterator2:Dot(offsetIterator2), nil
  158.     for index = 3, count do
  159.         vertexIterator1, vertexIterator2, vertexIterator3 = vertexIterator2, vertexIterator3, vertices[index]
  160.         offsetIterator1, offsetIterator2, offsetIterator3 = offsetIterator2, vertexIterator3 - vertexIterator2, vertexIterator1 - vertexIterator3
  161.         dotIterator1, dotIterator2, dotIterator3 = dotIterator2, offsetIterator2:Dot(offsetIterator2), offsetIterator3:Dot(offsetIterator3)
  162.         local vertex1, vertex2, vertex3
  163.         local offset1, offset2, offset3
  164.         local dot1, dot2, dot3
  165.         if dotIterator1 > dotIterator2 then
  166.             if dotIterator1 > dotIterator3 then
  167.                 vertex1, vertex2, vertex3 = vertexIterator1, vertexIterator2, vertexIterator3
  168.                 offset1, offset2, offset3 = offsetIterator1, offsetIterator2, offsetIterator3
  169.                 dot1, dot2, dot3 = dotIterator1, dotIterator2, dotIterator3
  170.             else
  171.                 vertex1, vertex2, vertex3 = vertexIterator3, vertexIterator1, vertexIterator2
  172.                 offset1, offset2, offset3 = offsetIterator3, offsetIterator1, offsetIterator2
  173.                 dot1, dot2, dot3 = dotIterator3, dotIterator1, dotIterator2
  174.             end
  175.         elseif dotIterator2 > dotIterator3 then
  176.             vertex1, vertex2, vertex3 = vertexIterator2, vertexIterator3, vertexIterator1
  177.             offset1, offset2, offset3 = offsetIterator2, offsetIterator3, offsetIterator1
  178.             dot1, dot2, dot3 = dotIterator2, dotIterator3, dotIterator1
  179.         else
  180.             vertex1, vertex2, vertex3 = vertexIterator3, vertexIterator1, vertexIterator2
  181.             offset1, offset2, offset3 = offsetIterator3, offsetIterator1, offsetIterator2
  182.             dot1, dot2, dot3 = dotIterator3, dotIterator1, dotIterator2
  183.         end
  184.         local length1 = math.sqrt(dot1)
  185.         local distanceMiddle = (dot1 + dot3 - dot2) / (2 * length1)
  186.         local offsetMiddle = vertex1:Lerp(vertex2, distanceMiddle / length1)
  187.         local offsetTop = vertex3 - offsetMiddle
  188.         local height = offsetTop.magnitude
  189.         local axisY, axisZ = offsetTop / height, offset1 / length1
  190.         local axisX = axisY:Cross(axisZ)
  191.         local size1, size2 = Vector3.new(thickness, height, distanceMiddle), Vector3.new(thickness, height, length1 - distanceMiddle)
  192.         local part1, part2 = stockPart:Clone(), stockPart:Clone()
  193.         part1.CFrame = CFrame.new(offsetMiddle.X, offsetMiddle.Y, offsetMiddle.Z, axisX.X, axisY.X, axisZ.X, axisX.Y, axisY.Y, axisZ.Y, axisX.Z, axisY.Z, axisZ.Z) * CFrame.new(offsetMultiplier * -vertexTriangleOffset, height * 0.5, distanceMiddle * -0.5)
  194.         part2.CFrame = CFrame.new(offsetMiddle.X, offsetMiddle.Y, offsetMiddle.Z, -axisX.X, axisY.X, -axisZ.X, -axisX.Y, axisY.Y, -axisZ.Y, -axisX.Z, axisY.Z, -axisZ.Z) * CFrame.new(offsetMultiplier * vertexTriangleOffset, height * 0.5, (distanceMiddle - length1) * 0.5)
  195.         part1.Size = size1
  196.         part2.Size = size2
  197.         local realSize1, realSize2 = part1.Size, part2.Size
  198.         if size1 ~= realSize1 or size2 ~= realSize2 then
  199.             local mesh1 = Instance.new("SpecialMesh")
  200.             mesh1.MeshType = "Wedge"
  201.             mesh1.Name = "Mesh"
  202.             local mesh2 = mesh1:Clone()
  203.             mesh1.Scale = size1 / realSize1
  204.             mesh2.Scale = size2 / realSize2
  205.             mesh1.Parent = part1
  206.             mesh2.Parent = part2
  207.         end
  208.         if not vertexFixed then
  209.             VertexGraphics.joinParts(part1, part2)
  210.             if previous then
  211.                 VertexGraphics.joinParts(previous, part1)
  212.             end
  213.         end
  214.         previous = part1
  215.         part1.Parent = parent
  216.         part2.Parent = parent
  217.         offsetMultiplier = -offsetMultiplier
  218.     end
  219.     parent.PrimaryPart = previous
  220. end
  221. function VertexGraphics.joinModels(model1, model2)
  222.     VertexGraphics.joinParts(model1.PrimaryPart, model2.PrimaryPart)
  223. end
  224. function VertexGraphics.joinParts(part0, part1)
  225.     local weld = Instance.new("Weld", part0)
  226.     weld.Part0 = part0
  227.     weld.Part1 = part1
  228.     weld.C0 = part0.CFrame:inverse()
  229.     weld.C1 = part1.CFrame:inverse()
  230. end
  231.  
  232. function VertexGraphics.setAlpha(alpha)
  233.     vertexTransparency = 1 - alpha
  234. end
  235. function VertexGraphics.setColor(color)
  236.     vertexColor = color
  237. end
  238. function VertexGraphics.setFixed(fixed)
  239.     vertexFixed = fixed
  240. end
  241. function VertexGraphics.setLocked(locked)
  242.     vertexLocked = locked
  243. end
  244. function VertexGraphics.setMaterial(material)
  245.     vertexMaterial = material
  246. end
  247. function VertexGraphics.setSolid(solid)
  248.     vertexSolid = solid
  249. end
  250. function VertexGraphics.setTriangleOffset(triangleOffset)
  251.     vertexTriangleOffset = triangleOffset
  252. end
  253.  
  254. return VertexGraphics
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement