GUI fixes; Mesh loader WIP

This commit is contained in:
Nikita Kruglickiy
2021-01-19 14:08:53 +06:00
parent d4dd889bb5
commit ceaada7e2d
16 changed files with 433 additions and 58 deletions

View File

@@ -1,5 +0,0 @@
BaseEntity = class("BaseEntity")
function BaseEntity:initialize()
end

View File

@@ -6,12 +6,17 @@ MeshBuilder = class("MeshBuilder")
function MeshBuilder:initialize()
self._objects = {}
self._bundle = {}
self._setups = {}
if CLIENT then
self._setups = {}
self._meshData = {}
net.receive("sendHolograms", function(len)
--[[
self._shouldBuild = false
self._shouldRevision = true
]]
net.receive("holograms", function(len)
local hasNext = net.readBit()
while hasNext == 1 do
@@ -33,9 +38,47 @@ function MeshBuilder:initialize()
hasNext = net.readBit()
end
end)
--[[
net.receive("revision", function()
local hasNext = net.readBit()
while hasNext == 1 do
local key = net.readString()
net.readEntity(function(ent)
local holo = ent:toHologram()
self._objects[key] = holo
end)
hasNext = net.readBit()
end
self._shouldRevision = false
if self._shouldBuild then
self:build()
self._shouldBuild = false
end
end)
]]
else
net.receive("sendObjects", function(len, ply)
--[[
net.receive("revision", function(len, ply)
net.start("revision")
for k, v in pairs(self._objects) do
net.writeBit(1)
net.writeString(k)
net.writeEntity(v)
end
net.writeBit(0)
net.send()
end)
]]
net.receive("setups", function(len, ply)
local hasNext = net.readBit()
while hasNext == 1 do
@@ -62,15 +105,15 @@ function MeshBuilder:initialize()
self._objects[key] = holo
end
if not self._bundle[key] then
self._bundle[key] = self._objects[key]
if not self._setups[key] then
self._setups[key] = self._objects[key]
end
hasNext = net.readBit()
end
net.start("sendHolograms")
for k, v in pairs(self._bundle) do
net.start("holograms")
for k, v in pairs(self._setups) do
net.writeBit(1)
net.writeString(k)
net.writeEntity(v)
@@ -78,7 +121,7 @@ function MeshBuilder:initialize()
net.writeBit(0)
net.send(ply)
table.empty(self._bundle)
table.empty(self._setups)
end)
end
end
@@ -89,8 +132,8 @@ if CLIENT then
end
function MeshBuilder:setup(key, pos, ang, scale, color, mat, parent, relativeTo)
if not self._objects[key] and not self._bundle[key] and self._meshData[key] then
self._bundle[key] = {
if not self._objects[key] and not self._setups[key] and self._meshData[key] then
self._setups[key] = {
pos = pos,
ang = ang,
scale = scale,
@@ -109,9 +152,20 @@ if CLIENT then
end
function MeshBuilder:build()
local function send(objects)
net.start("sendObjects")
for k, v in pairs(objects) do
--[[
if self._shouldRevision then
net.start("revision")
net.send()
self._shouldBuild = true
return
end
]]
local function sendSetups(setups)
net.start("setups")
for k, v in pairs(setups) do
net.writeBit(1)
net.writeString(k)
net.writeVector(v.pos)
@@ -126,28 +180,28 @@ if CLIENT then
net.send()
end
local bundleKeys = table.getKeys(self._bundle)
local bundleKeys = table.getKeys(self._setups)
if #bundleKeys > BUNDLE_SIZE then
local i = 1
timer.create("send", SEND_DELAY, math.ceil(#bundleKeys / BUNDLE_SIZE), function()
timer.create("sendSetups", SEND_DELAY, math.ceil(#bundleKeys / BUNDLE_SIZE), function()
local from = (i - 1) * BUNDLE_SIZE + 1
local objects = {}
local setups = {}
for _, v in pairs({ unpack(bundleKeys, from, from + BUNDLE_SIZE - 1) }) do
objects[v] = self._bundle[v]
setups[v] = self._setups[v]
end
send(objects)
sendSetups(setups)
if i < math.ceil(#bundleKeys / BUNDLE_SIZE) then
i = i + 1
else
table.empty(self._bundle)
table.empty(self._setups)
end
end)
else
send(self._bundle)
send(self._setups)
end
end
end

View File

@@ -0,0 +1,109 @@
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

View File

@@ -0,0 +1,3 @@
--@include /koptilnya/libs/utils.txt
require("/koptilnya/libs/utils.txt")

View File

@@ -0,0 +1,18 @@
--@include /koptilnya/libs/utils.txt
require("/koptilnya/libs/utils.txt")
Mesh = class("Mesh")
accessorFunc(Mesh, "_entity", "Entity", chip())
if SERVER then
else
function Mesh:setData(data)
self:getEntity():setMesh(data)
self:getEntity():setRenderBounds(Vector(-200), Vector(200))
end
end
--function Mesh:get

View File

@@ -2,14 +2,19 @@ local MAX_QUOTA = 0.75
Parser = class("Parser")
function Parser:initialize(link)
local initialChipName = chip():getChipName()
local function setStatus(status)
setName(string.format("%s (%s)", initialChipName, status))
end
function Parser:initialize(link)
if CLIENT then
local triangles = mesh.trianglesLeft()
local createFromObjCoroutine = coroutine.create(function(objData)
self:OnLoaded(objData, mesh.createFromObj(objData, true))
end)
print("Getting file...")
setStatus("Getting file...")
http.get(link, function(objData)
local loadMesh = coroutine.wrap(function()
self.meshData = mesh.createFromObj(objData, true)
@@ -17,10 +22,11 @@ function Parser:initialize(link)
return true
end)
print("File received, start parsing...")
setStatus("File received, start parsing...")
hook.add("think", "loadingMesh", function()
while quotaAverage() < quotaMax() * MAX_QUOTA do
if loadMesh() then
setName(initialChipName)
self:onLoaded(objData, self.meshData, triangles - mesh.trianglesLeft())
hook.remove("think", "loadingMesh")

View File

@@ -0,0 +1,97 @@
--@include /koptilnya/libs/utils.txt
require("/koptilnya/libs/utils.txt")
accessorFunc(Mesh, "_relativeTo", "RelativeTo", nil)
function Mesh:initialize(pos, ang, scale, color, mat, parent, relativeTo)
--create holo
self:setPos(pos)
self:setAng(ang)
self:setScale(scale)
self:setColor(color)
self:setMaterial(mat)
self:setParent(parent)
self:setRelativeTo(relativeTo)
end
function Mesh:getPos()
return self:getEntity():getPos()
end
function Mesh:setPos(pos)
self:getEntity():setPos(pos)
end
function Mesh:getRelativePos()
if isValid(self:getRelativeTo()) then
return self:getRelativeTo():worldToLocal(self:getPos())
else
return self:getPos()
end
end
function Mesh:setRelativePos(pos)
if isValid(self:getRelativeTo()) then
self:setPos(self:getRelativeTo():localToWorld(pos))
else
self:setPos(pos)
end
end
function Mesh:getAng()
return self:getEntity():getAng()
end
function Mesh:setAng(pos)
self:getEntity():setAng(pos)
end
function Mesh:getRelativeAng()
if isValid(self:getRelativeTo()) then
return self:getRelativeTo():worldToLocalAngles(self:getAng())
else
return self:getAng()
end
end
function Mesh:setRelativeAng(ang)
if isValid(self:getRelativeTo()) then
self:setAng(self:getRelativeTo():localToWorldAngles(ang))
else
self:setAng(ang)
end
end
function Mesh:getScale()
return self:getEntity():getScale()
end
function Mesh:setScale(scale)
self:getEntity():setScale(scale)
end
function Mesh:getColor()
return self:getEntity():getColor()
end
function Mesh:setColor(color)
self:getEntity():setColor(color)
end
function Mesh:getMaterial()
return self:getEntity():getMaterial()
end
function Mesh:setMaterial(material)
self:getEntity():setMaterial(material)
end
function Mesh:getParent()
return self:getEntity():getParent()
end
function Mesh:setParent(parent)
self:getEntity():setParent(parent)
end