local MODEL_PLACEHOLDER = "models/holograms/cube.mdl" MeshBuilder = class("MeshBuilder") function MeshBuilder:initialize() self._holograms = {} if SERVER then self._meshObjects = {} self._setupAllArgs = nil net.receive("meshDataSet", function(_, ply) self._meshObjects = net.readTable() if self._setupAllArgs ~= nil then self:setupAll(unpack(self._setupAllArgs)) self._setupAllArgs = nil end net.start("holograms") for k, v in pairs(self._holograms) do net.writeBit(1) net.writeString(k) net.writeEntity(v) end net.writeBit(0) net.send(ply) end) else self._meshData = {} self._hologramsReceived = false net.receive("holograms", function() local hasNext = net.readBit() while hasNext == 1 do local key = net.readString() net.readEntity(function(ent) if not isValid(ent) then return end if self._meshData[key] and not self._holograms[key] then self._holograms[key] = ent:toHologram() end end) hasNext = net.readBit() end self._hologramsReceived = true self:applyMeshes() end) end end if SERVER then function MeshBuilder:setup(key, pos, ang, scale, color, mat, parent, relativeTo) if isValid(self._holograms[key]) then return end if isValid(relativeTo) then pos = relativeTo:localToWorld(pos) ang = relativeTo:localToWorldAngles(ang) end local holo = holograms.create(pos, ang, MODEL_PLACEHOLDER, scale) holo:setColor(color) holo:setMaterial(mat) holo:setParent(parent) self._meshes[key] = Mesh:new() self._holograms[key] = holo return holo end function MeshBuilder:setupAll(pos, ang, scale, color, mat, parent, relativeTo) if #self._meshObjects > 0 then for _, v in pairs(self._meshObjects) do self:setup(v, pos, ang, scale, color, mat, parent, relativeTo) end else self._setupAllArgs = {pos, ang, scale, color, mat, parent, relativeTo} end end else function MeshBuilder:setMeshData(meshData) self._meshData = meshData if self._hologramsReceived then self:applyMeshes() else net.start("meshDataSet") net.writeTable(table.getKeys(meshData)) net.send() end end function MeshBuilder:applyMeshes() for k, v in pairs(self._holograms) do if isValid(v) then v:setMesh(self._meshData[k]) v:setRenderBounds(Vector(-200), Vector(200)) end end end end