From 4c12c9d9ed4672e908d6c09a241e55d24b28be22 Mon Sep 17 00:00:00 2001 From: Nikita Kruglickiy Date: Tue, 23 Mar 2021 00:42:00 +0600 Subject: [PATCH] mesh loader v2 --- koptilnya/car_parts/anchor.txt | 5 +++ koptilnya/mesh_loader/cl_builder.txt | 7 ++-- koptilnya/mesh_loader/sv_builder.txt | 7 +++- koptilnya/mesh_loader2/builder.txt | 7 ++++ koptilnya/mesh_loader2/cl_builder.txt | 57 +++++++++++++++++++++++++++ koptilnya/mesh_loader2/obj_parser.txt | 40 +++++++++++++++++++ koptilnya/mesh_loader2/sv_builder.txt | 55 ++++++++++++++++++++++++++ 7 files changed, 173 insertions(+), 5 deletions(-) create mode 100644 koptilnya/car_parts/anchor.txt create mode 100644 koptilnya/mesh_loader2/builder.txt create mode 100644 koptilnya/mesh_loader2/cl_builder.txt create mode 100644 koptilnya/mesh_loader2/obj_parser.txt create mode 100644 koptilnya/mesh_loader2/sv_builder.txt diff --git a/koptilnya/car_parts/anchor.txt b/koptilnya/car_parts/anchor.txt new file mode 100644 index 0000000..94d37ce --- /dev/null +++ b/koptilnya/car_parts/anchor.txt @@ -0,0 +1,5 @@ +Anchor = class("Anchor") + +function Anchor:initialize(pos, ang, parent, relativeTo) + +end \ No newline at end of file diff --git a/koptilnya/mesh_loader/cl_builder.txt b/koptilnya/mesh_loader/cl_builder.txt index 1cbbd01..adc0df9 100644 --- a/koptilnya/mesh_loader/cl_builder.txt +++ b/koptilnya/mesh_loader/cl_builder.txt @@ -22,7 +22,6 @@ function MeshBuilder:initialize(link, maxQuota) net.receive("holograms", function() local hasNext = net.readBit() - local test = {} while hasNext == 1 do local name = net.readString() @@ -30,14 +29,16 @@ function MeshBuilder:initialize(link, maxQuota) local holo = ent:toHologram() table.insert(self._objects, {name = name, holo = holo}) - table.insert(test, {name = name, holo = holo}) end) hasNext = net.readBit() end - self:onHologramsReceived(self._objects) self:_applyMeshes() + + timer.simple(0, function() + self:onHologramsReceived(self._objects) + end) end) end diff --git a/koptilnya/mesh_loader/sv_builder.txt b/koptilnya/mesh_loader/sv_builder.txt index 5fe954e..8b8701a 100644 --- a/koptilnya/mesh_loader/sv_builder.txt +++ b/koptilnya/mesh_loader/sv_builder.txt @@ -15,8 +15,11 @@ function MeshBuilder:initialize(link, modelPlaceholder) table.insert(self._objectsNames, object) end - self.isReady = true - self:onReady(self._objectsNames) + + timer.simple(0, function() + self.isReady = true + self:onReady(self._objectsNames) + end) for _, v in pairs(self._readyPlayers) do self:_sendHolograms(v) diff --git a/koptilnya/mesh_loader2/builder.txt b/koptilnya/mesh_loader2/builder.txt new file mode 100644 index 0000000..d4951a2 --- /dev/null +++ b/koptilnya/mesh_loader2/builder.txt @@ -0,0 +1,7 @@ +-- @include sv_builder.txt +-- @include cl_builder.txt +if SERVER then + require("sv_builder.txt") +else + require("cl_builder.txt") +end diff --git a/koptilnya/mesh_loader2/cl_builder.txt b/koptilnya/mesh_loader2/cl_builder.txt new file mode 100644 index 0000000..2f53d79 --- /dev/null +++ b/koptilnya/mesh_loader2/cl_builder.txt @@ -0,0 +1,57 @@ +-- @client +-- @include /koptilnya/libs/table.txt +-- @include obj_parser.txt +require("/koptilnya/libs/table.txt") +require("obj_parser.txt") + +MeshBuilder = class("MeshBuilder") + +function MeshBuilder:initialize(link, maxQuota) + self.link = link + self.meshData = {} + + self._objects = {} + self._parser = ObjParser:new(link, maxQuota) + self._parser.onLoaded = function(parser, objData, meshData, usedTriangles) + self.meshData = meshData + + self:_applyMeshes() + end + + net.receive("holograms", function() + local newObjects = {} + local hasNext = net.readBit() + + while hasNext == 1 do + local name = net.readString() + + net.readEntity(function(ent) + local holo = ent:toHologram() + local object = {name = name, holo = holo, meshApplied = false} + + table.insert(newObjects, object) + table.insert(self._objects, object) + end) + + hasNext = net.readBit() + end + + timer.simple(0, function() + self:_applyMeshes() + self:onHologramsReceived(newObjects, self._objects) + end) + end) +end + +function MeshBuilder:_applyMeshes() + for _, v in pairs(self._objects) do + if self.meshData[v.name] ~= nil and not v.meshApplied then + v.holo:setMesh(self.meshData[v.name]) + v.holo:setRenderBounds(Vector(-200), Vector(200)) + v.meshApplied = true + end + end +end + +function MeshBuilder:onHologramsReceived(objects) +end diff --git a/koptilnya/mesh_loader2/obj_parser.txt b/koptilnya/mesh_loader2/obj_parser.txt new file mode 100644 index 0000000..9ee10d7 --- /dev/null +++ b/koptilnya/mesh_loader2/obj_parser.txt @@ -0,0 +1,40 @@ +-- @client +ObjParser = class("ObjParser") + +local initialChipName = chip():getChipName() +local function setStatus(status) + setName(string.format("%s (%s)", initialChipName, status)) +end + +function ObjParser:initialize(link, maxQuota) + self.maxQuota = maxQuota or 0.6 + + local triangles = mesh.trianglesLeft() + + setStatus("Getting file...") + http.get(link, function(objData) + objData = string.gsub(objData, "\nl%s%d+%s%d+", "") + + local loadMesh = coroutine.wrap(function() + self.meshData = mesh.createFromObj(objData, true, true) + + return true + end) + + setStatus("File received, start parsing...") + hook.add("think", "loadingMesh", function() + while math.max(quotaAverage(), quotaUsed()) < quotaMax() * self.maxQuota do + if loadMesh() then + setName(initialChipName) + self:onLoaded(objData, self.meshData, triangles - mesh.trianglesLeft()) + hook.remove("think", "loadingMesh") + + return + end + end + end) + end) +end + +function ObjParser:onLoaded(objData, meshData, usedTriangles) +end diff --git a/koptilnya/mesh_loader2/sv_builder.txt b/koptilnya/mesh_loader2/sv_builder.txt new file mode 100644 index 0000000..9586dd4 --- /dev/null +++ b/koptilnya/mesh_loader2/sv_builder.txt @@ -0,0 +1,55 @@ +-- @server +MeshBuilder = class("MeshBuilder") + +function MeshBuilder:initialize(link, modelPlaceholder) + self.link = link + self.modelPlaceholder = modelPlaceholder or "models/holograms/cube.mdl" + + self._objects = {} +end + +function MeshBuilder:_sendHolograms() + if #self._objects == 0 then + return + end + + net.start("holograms") + for _, v in pairs(self._objects) do + net.writeBit(1) + net.writeString(v.name) + net.writeEntity(v.holo) + print(v.name) + end + net.writeBit(0) + net.send() +end + +function MeshBuilder:reset() + self._objects = {} +end + +function MeshBuilder:build(name, pos, ang, scale, color, mat, parent, relativeTo) + if isValid(relativeTo) then + pos = relativeTo:localToWorld(pos) + ang = relativeTo:localToWorldAngles(ang) + end + + local holo = holograms.create(pos, ang, self.modelPlaceholder, scale) + holo:setColor(color) + holo:setMaterial(mat) + + if isValid(parent) then + holo:setParent(parent) + end + + table.insert(self._objects, {name = name, holo = holo}) +end + +function MeshBuilder:getResult() + local result = self._objects + + self:_sendHolograms() + self:reset() + + return result +end