fix(client/zones): convert tables to vectors

Ensure tables (either array or map) set as points, coords, or size are
converted into vectors.
Includes complementary reformatting.
This commit is contained in:
Linden
2022-08-30 02:58:13 +10:00
parent 4a5251b60b
commit 3a97a0c569

View File

@@ -40,11 +40,11 @@ local function getTriangles(polygon)
if unique then if unique then
h = #horizontals + 1 h = #horizontals + 1
horizontals[h] = {point} horizontals[h] = { point }
end end
sides[i] = {polygon[i], polygon[i + 1] or polygon[1]} sides[i] = { polygon[i], polygon[i + 1] or polygon[1] }
points[polygon[i]] = {side = i, horizontal = h, uses = 0} points[polygon[i]] = { side = i, horizontal = h, uses = 0 }
end end
local extremes = { polygon.projectToAxis(polygon, vec(1, 0, 0)) } local extremes = { polygon.projectToAxis(polygon, vec(1, 0, 0)) }
@@ -73,7 +73,7 @@ local function getTriangles(polygon)
if valid then if valid then
horizontals[i][#horizontals[i] + 1] = newPoint horizontals[i][#horizontals[i] + 1] = newPoint
sides[j][#sides[j] + 1] = newPoint sides[j][#sides[j] + 1] = newPoint
points[newPoint] = {side = j, horizontal = i, uses = 0} points[newPoint] = { side = j, horizontal = i, uses = 0 }
break break
end end
end end
@@ -190,7 +190,7 @@ local function getTriangles(polygon)
end end
if c or d then if c or d then
local t = {a, b, c, d} local t = { a, b, c, d }
nTriangles = #triangles nTriangles = #triangles
triangles[nTriangles + 1], triangles[nTriangles + 2] = makeTriangles(t) triangles[nTriangles + 1], triangles[nTriangles + 2] = makeTriangles(t)
if c and d then if c and d then
@@ -289,8 +289,10 @@ local DrawPoly = DrawPoly
local function debugPoly(self) local function debugPoly(self)
for i = 1, #self.triangles do for i = 1, #self.triangles do
local triangle = self.triangles[i] local triangle = self.triangles[i]
DrawPoly(triangle[1].x, triangle[1].y, triangle[1].z, triangle[2].x, triangle[2].y, triangle[2].z, triangle[3].x, triangle[3].y, triangle[3].z, 255, 42, 24, 100) DrawPoly(triangle[1].x, triangle[1].y, triangle[1].z, triangle[2].x, triangle[2].y, triangle[2].z, triangle[3].x,
DrawPoly(triangle[2].x, triangle[2].y, triangle[2].z, triangle[1].x, triangle[1].y, triangle[1].z, triangle[3].x, triangle[3].y, triangle[3].z, 255, 42, 24, 100) triangle[3].y, triangle[3].z, 255, 42, 24, 100)
DrawPoly(triangle[2].x, triangle[2].y, triangle[2].z, triangle[1].x, triangle[1].y, triangle[1].z, triangle[3].x,
triangle[3].y, triangle[3].z, 255, 42, 24, 100)
end end
for i = 1, #self.polygon do for i = 1, #self.polygon do
local thickness = vec(0, 0, self.thickness / 2) local thickness = vec(0, 0, self.thickness / 2)
@@ -305,7 +307,8 @@ local function debugPoly(self)
end end
local function debugSphere(self) local function debugSphere(self)
DrawMarker(28, self.coords.x, self.coords.y, self.coords.z, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, self.radius, self.radius, self.radius, 255, 42, 24, 100, false, false, false, true, false, false, false) DrawMarker(28, self.coords.x, self.coords.y, self.coords.z, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, self.radius, self.radius,
self.radius, 255, 42, 24, 100, false, false, false, true, false, false, false)
end end
local glm_polygon_contains = glm.polygon.contains local glm_polygon_contains = glm.polygon.contains
@@ -318,11 +321,34 @@ local function insideSphere(self, coords)
return #(self.coords - coords) < self.radius return #(self.coords - coords) < self.radius
end end
local function convertToVector(coords)
local _type = type(coords)
if _type ~= 'vector3' then
if _type == 'table' then
return vec3(coords[1] or coords.x, coords[2] or coords.y, coords[3] or coords.z)
end
error(("expected type 'vector3' or 'table' (received %s)"):format(_type))
end
return coords
end
return { return {
poly = function(data) poly = function(data)
data.id = #Zones + 1 data.id = #Zones + 1
data.thickness = data.thickness or 4 data.thickness = data.thickness or 4
data.polygon = glm.polygon.new(data.points)
local pointN = #data.points
local points = table.create(pointN, 0)
for i = 1, pointN do
points[i] = convertToVector(data.points[i])
end
data.polygon = glm.polygon.new(points)
data.coords = data.polygon:centroid() data.coords = data.polygon:centroid()
data.remove = removeZone data.remove = removeZone
data.contains = contains data.contains = contains
@@ -338,7 +364,8 @@ return {
box = function(data) box = function(data)
data.id = #Zones + 1 data.id = #Zones + 1
data.size = data.size and data.size / 2 or vec3(2) data.coords = convertToVector(data.coords)
data.size = data.size and convertToVector(data.size) / 2 or vec3(2)
data.thickness = data.size.z * 2 or 4 data.thickness = data.size.z * 2 or 4
data.rotation = quat(data.rotation or 0, vec3(0, 0, 1)) data.rotation = quat(data.rotation or 0, vec3(0, 0, 1))
data.polygon = (data.rotation * glm.polygon.new({ data.polygon = (data.rotation * glm.polygon.new({
@@ -351,7 +378,7 @@ return {
data.contains = contains data.contains = contains
if data.debug then if data.debug then
data.triangles = {makeTriangles({data.polygon[1], data.polygon[2], data.polygon[4], data.polygon[3]})} data.triangles = { makeTriangles({ data.polygon[1], data.polygon[2], data.polygon[4], data.polygon[3] }) }
data.debug = debugPoly data.debug = debugPoly
end end
@@ -361,6 +388,7 @@ return {
sphere = function(data) sphere = function(data)
data.id = #Zones + 1 data.id = #Zones + 1
data.coords = convertToVector(data.coords)
data.radius = (data.radius or 2) + 0.0 data.radius = (data.radius or 2) + 0.0
data.remove = removeZone data.remove = removeZone
data.contains = insideSphere data.contains = insideSphere
@@ -372,4 +400,4 @@ return {
Zones[data.id] = data Zones[data.id] = data
return data return data
end, end,
} }