]> git.lizzy.rs Git - minetest.git/blobdiff - builtin/game/voxelarea.lua
Add VoxelArea() constructor (#12886)
[minetest.git] / builtin / game / voxelarea.lua
index 64436bf1a33772c5523d51e5767c1144d4b8a7fa..a9195213bdbd3ea74a8b7e385027d2a3de7831e8 100644 (file)
@@ -1,11 +1,17 @@
+local math_floor = math.floor
+local vector_new = vector.new
+
 VoxelArea = {
-       MinEdge = vector.new(1, 1, 1),
-       MaxEdge = vector.new(0, 0, 0),
+       MinEdge = vector_new(1, 1, 1),
+       MaxEdge = vector_new(0, 0, 0),
        ystride = 0,
        zstride = 0,
 }
 
-function VoxelArea:new(o)
+local class_metatable = {}
+setmetatable(VoxelArea, class_metatable)
+
+local function new(self, o)
        o = o or {}
        setmetatable(o, self)
        self.__index = self
@@ -17,9 +23,15 @@ function VoxelArea:new(o)
        return o
 end
 
+function class_metatable:__call(MinEdge, MaxEdge)
+       return new(self, {MinEdge = MinEdge, MaxEdge = MaxEdge})
+end
+
+VoxelArea.new = new
+
 function VoxelArea:getExtent()
        local MaxEdge, MinEdge = self.MaxEdge, self.MinEdge
-       return vector.new(
+       return vector_new(
                MaxEdge.x - MinEdge.x + 1,
                MaxEdge.y - MinEdge.y + 1,
                MaxEdge.z - MinEdge.z + 1
@@ -36,7 +48,7 @@ function VoxelArea:index(x, y, z)
        local i = (z - MinEdge.z) * self.zstride +
                          (y - MinEdge.y) * self.ystride +
                          (x - MinEdge.x) + 1
-       return math.floor(i)
+       return math_floor(i)
 end
 
 function VoxelArea:indexp(p)
@@ -44,24 +56,23 @@ function VoxelArea:indexp(p)
        local i = (p.z - MinEdge.z) * self.zstride +
                          (p.y - MinEdge.y) * self.ystride +
                          (p.x - MinEdge.x) + 1
-       return math.floor(i)
+       return math_floor(i)
 end
 
 function VoxelArea:position(i)
-       local p = {}
        local MinEdge = self.MinEdge
 
        i = i - 1
 
-       p.z = math.floor(i / self.zstride) + MinEdge.z
+       local z = math_floor(i / self.zstride) + MinEdge.z
        i = i % self.zstride
 
-       p.y = math.floor(i / self.ystride) + MinEdge.y
+       local y = math_floor(i / self.ystride) + MinEdge.y
        i = i % self.ystride
 
-       p.x = math.floor(i) + MinEdge.x
+       local x = math_floor(i) + MinEdge.x
 
-       return p
+       return vector_new(x, y, z)
 end
 
 function VoxelArea:contains(x, y, z)