Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- By noliCAIKS/RPFeltz, somewhere in 2014
- local VertexGraphics = {}
- local vertexColor = BrickColor.new(Color3.new(0, 0, 0))
- local vertexFixed = true
- local vertexLocked = true
- local vertexMaterial = Enum.Material.Plastic
- local vertexSolid = false
- local vertexTransparency = 0
- local vertexTriangleOffset = 0
- local function GenerateStockPart(className)
- local stockPart = Instance.new(className)
- stockPart.Anchored = vertexFixed
- stockPart.BackSurface = "SmoothNoOutlines"
- stockPart.BottomSurface = "SmoothNoOutlines"
- stockPart.BrickColor = vertexColor
- stockPart.CanCollide = vertexSolid
- stockPart.FormFactor = "Custom"
- stockPart.FrontSurface = "SmoothNoOutlines"
- stockPart.LeftSurface = "SmoothNoOutlines"
- stockPart.Locked = vertexLocked
- stockPart.Material = vertexMaterial
- stockPart.RightSurface = "SmoothNoOutlines"
- stockPart.TopSurface = "SmoothNoOutlines"
- stockPart.Transparency = vertexTransparency
- return stockPart
- end
- function VertexGraphics.drawLineFan(vertices, parent, thickness)
- thickness = thickness or 0.2
- local stockPart = GenerateStockPart("Part")
- local count = #vertices
- local previous = nil
- local vertex1, vertex2 = vertices[1], nil
- for index = 2, count do
- vertex2 = vertices[index]
- local offset = vertex2 - vertex1
- local distance = offset.magnitude
- local center = vertex1:Lerp(vertex2, 0.5)
- local part = stockPart:Clone()
- local mesh = Instance.new("CylinderMesh", part)
- local size = Vector3.new(thickness, distance, thickness)
- part.CFrame = CFrame.new(center, vertex2) * CFrame.new(0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 1, 0)
- part.Size = size
- mesh.Scale = size / part.Size
- if not vertexFixed and previous then
- JoinParts(previous, part)
- end
- previous = part
- part.Parent = parent
- end
- parent.PrimaryPart = previous
- end
- function VertexGraphics.drawLineStrip(vertices, parent, thickness)
- thickness = thickness or 0.2
- local stockPart = GenerateStockPart("Part")
- local count = #vertices
- local previous = nil
- local vertex1, vertex2 = nil, vertices[1]
- for index = 2, count do
- vertex1, vertex2 = vertex2, vertices[index]
- local offset = vertex2 - vertex1
- local distance = offset.magnitude
- local center = vertex1:Lerp(vertex2, 0.5)
- local part = stockPart:Clone()
- local mesh = Instance.new("CylinderMesh", part)
- local size = Vector3.new(thickness, distance, thickness)
- part.CFrame = CFrame.new(center, vertex2) * CFrame.new(0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 1, 0)
- part.Size = size
- mesh.Scale = size / part.Size
- if not vertexFixed and previous then
- JoinParts(previous, part)
- end
- previous = part
- part.Parent = parent
- end
- parent.PrimaryPart = previous
- end
- function VertexGraphics.drawTriangleFan(vertices, parent, thickness)
- thickness = thickness or 0
- local stockPart = GenerateStockPart("WedgePart")
- local count = #vertices
- local previous = nil
- local vertexIterator1, vertexIterator2, vertexIterator3 = vertices[1], nil, vertices[2]
- local offsetIterator1, offsetIterator2, offsetIterator3 = nil, nil, vertexIterator1 - vertexIterator3
- local dotIterator1, dotIterator2, dotIterator3 = nil, nil, offsetIterator3:Dot(offsetIterator3)
- for index = 3, count do
- vertexIterator2, vertexIterator3 = vertexIterator3, vertices[index]
- offsetIterator1, offsetIterator2, offsetIterator3 = -offsetIterator3, vertexIterator3 - vertexIterator2, vertexIterator1 - vertexIterator3
- dotIterator1, dotIterator2, dotIterator3 = dotIterator3, offsetIterator2:Dot(offsetIterator2), offsetIterator3:Dot(offsetIterator3)
- local vertex1, vertex2, vertex3
- local offset1, offset2, offset3
- local dot1, dot2, dot3
- if dotIterator1 > dotIterator2 then
- if dotIterator1 > dotIterator3 then
- vertex1, vertex2, vertex3 = vertexIterator1, vertexIterator2, vertexIterator3
- offset1, offset2, offset3 = offsetIterator1, offsetIterator2, offsetIterator3
- dot1, dot2, dot3 = dotIterator1, dotIterator2, dotIterator3
- else
- vertex1, vertex2, vertex3 = vertexIterator3, vertexIterator1, vertexIterator2
- offset1, offset2, offset3 = offsetIterator3, offsetIterator1, offsetIterator2
- dot1, dot2, dot3 = dotIterator3, dotIterator1, dotIterator2
- end
- elseif dotIterator2 > dotIterator3 then
- vertex1, vertex2, vertex3 = vertexIterator2, vertexIterator3, vertexIterator1
- offset1, offset2, offset3 = offsetIterator2, offsetIterator3, offsetIterator1
- dot1, dot2, dot3 = dotIterator2, dotIterator3, dotIterator1
- else
- vertex1, vertex2, vertex3 = vertexIterator3, vertexIterator1, vertexIterator2
- offset1, offset2, offset3 = offsetIterator3, offsetIterator1, offsetIterator2
- dot1, dot2, dot3 = dotIterator3, dotIterator1, dotIterator2
- end
- local length1 = math.sqrt(dot1)
- local distanceMiddle = (dot1 + dot3 - dot2) / (2 * length1)
- local offsetMiddle = vertex1:Lerp(vertex2, distanceMiddle / length1)
- local offsetTop = vertex3 - offsetMiddle
- local height = offsetTop.magnitude
- local axisY, axisZ = offsetTop / height, offset1 / length1
- local axisX = axisY:Cross(axisZ)
- local size1, size2 = Vector3.new(thickness, height, distanceMiddle), Vector3.new(thickness, height, length1 - distanceMiddle)
- local part1, part2 = stockPart:Clone(), stockPart:Clone()
- 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)
- 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)
- part1.Size = size1
- part2.Size = size2
- local realSize1, realSize2 = part1.Size, part2.Size
- if size1 ~= realSize1 or size2 ~= realSize2 then
- local mesh1 = Instance.new("SpecialMesh")
- mesh1.MeshType = "Wedge"
- local mesh2 = mesh1:Clone()
- mesh1.Scale = size1 / realSize1
- mesh2.Scale = size2 / realSize2
- mesh1.Parent = part1
- mesh2.Parent = part2
- end
- if not vertexFixed then
- VertexGraphics.joinParts(part1, part2)
- if previous then
- VertexGraphics.joinParts(previous, part1)
- end
- end
- previous = part1
- part1.Parent = parent
- part2.Parent = parent
- end
- parent.PrimaryPart = previous
- end
- function VertexGraphics.drawTriangleStrip(vertices, parent, thickness)
- thickness = thickness or 0
- local offsetMultiplier = 1
- local stockPart = GenerateStockPart("WedgePart")
- local count = #vertices
- local previous = nil
- local vertexIterator1, vertexIterator2, vertexIterator3 = nil, vertices[1], vertices[2]
- local offsetIterator1, offsetIterator2, offsetIterator3 = nil, vertexIterator3 - vertexIterator2, nil
- local dotIterator1, dotIterator2, dotIterator3 = nil, offsetIterator2:Dot(offsetIterator2), nil
- for index = 3, count do
- vertexIterator1, vertexIterator2, vertexIterator3 = vertexIterator2, vertexIterator3, vertices[index]
- offsetIterator1, offsetIterator2, offsetIterator3 = offsetIterator2, vertexIterator3 - vertexIterator2, vertexIterator1 - vertexIterator3
- dotIterator1, dotIterator2, dotIterator3 = dotIterator2, offsetIterator2:Dot(offsetIterator2), offsetIterator3:Dot(offsetIterator3)
- local vertex1, vertex2, vertex3
- local offset1, offset2, offset3
- local dot1, dot2, dot3
- if dotIterator1 > dotIterator2 then
- if dotIterator1 > dotIterator3 then
- vertex1, vertex2, vertex3 = vertexIterator1, vertexIterator2, vertexIterator3
- offset1, offset2, offset3 = offsetIterator1, offsetIterator2, offsetIterator3
- dot1, dot2, dot3 = dotIterator1, dotIterator2, dotIterator3
- else
- vertex1, vertex2, vertex3 = vertexIterator3, vertexIterator1, vertexIterator2
- offset1, offset2, offset3 = offsetIterator3, offsetIterator1, offsetIterator2
- dot1, dot2, dot3 = dotIterator3, dotIterator1, dotIterator2
- end
- elseif dotIterator2 > dotIterator3 then
- vertex1, vertex2, vertex3 = vertexIterator2, vertexIterator3, vertexIterator1
- offset1, offset2, offset3 = offsetIterator2, offsetIterator3, offsetIterator1
- dot1, dot2, dot3 = dotIterator2, dotIterator3, dotIterator1
- else
- vertex1, vertex2, vertex3 = vertexIterator3, vertexIterator1, vertexIterator2
- offset1, offset2, offset3 = offsetIterator3, offsetIterator1, offsetIterator2
- dot1, dot2, dot3 = dotIterator3, dotIterator1, dotIterator2
- end
- local length1 = math.sqrt(dot1)
- local distanceMiddle = (dot1 + dot3 - dot2) / (2 * length1)
- local offsetMiddle = vertex1:Lerp(vertex2, distanceMiddle / length1)
- local offsetTop = vertex3 - offsetMiddle
- local height = offsetTop.magnitude
- local axisY, axisZ = offsetTop / height, offset1 / length1
- local axisX = axisY:Cross(axisZ)
- local size1, size2 = Vector3.new(thickness, height, distanceMiddle), Vector3.new(thickness, height, length1 - distanceMiddle)
- local part1, part2 = stockPart:Clone(), stockPart:Clone()
- 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)
- 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)
- part1.Size = size1
- part2.Size = size2
- local realSize1, realSize2 = part1.Size, part2.Size
- if size1 ~= realSize1 or size2 ~= realSize2 then
- local mesh1 = Instance.new("SpecialMesh")
- mesh1.MeshType = "Wedge"
- mesh1.Name = "Mesh"
- local mesh2 = mesh1:Clone()
- mesh1.Scale = size1 / realSize1
- mesh2.Scale = size2 / realSize2
- mesh1.Parent = part1
- mesh2.Parent = part2
- end
- if not vertexFixed then
- VertexGraphics.joinParts(part1, part2)
- if previous then
- VertexGraphics.joinParts(previous, part1)
- end
- end
- previous = part1
- part1.Parent = parent
- part2.Parent = parent
- offsetMultiplier = -offsetMultiplier
- end
- parent.PrimaryPart = previous
- end
- function VertexGraphics.joinModels(model1, model2)
- VertexGraphics.joinParts(model1.PrimaryPart, model2.PrimaryPart)
- end
- function VertexGraphics.joinParts(part0, part1)
- local weld = Instance.new("Weld", part0)
- weld.Part0 = part0
- weld.Part1 = part1
- weld.C0 = part0.CFrame:inverse()
- weld.C1 = part1.CFrame:inverse()
- end
- function VertexGraphics.setAlpha(alpha)
- vertexTransparency = 1 - alpha
- end
- function VertexGraphics.setColor(color)
- vertexColor = color
- end
- function VertexGraphics.setFixed(fixed)
- vertexFixed = fixed
- end
- function VertexGraphics.setLocked(locked)
- vertexLocked = locked
- end
- function VertexGraphics.setMaterial(material)
- vertexMaterial = material
- end
- function VertexGraphics.setSolid(solid)
- vertexSolid = solid
- end
- function VertexGraphics.setTriangleOffset(triangleOffset)
- vertexTriangleOffset = triangleOffset
- end
- return VertexGraphics
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement