summaryrefslogtreecommitdiff
path: root/builtin
diff options
context:
space:
mode:
authorKahrl <kahrl@gmx.net>2013-07-09 16:26:52 +0200
committerKahrl <kahrl@gmx.net>2013-07-11 22:57:26 +0200
commit6027c8d25920fea23a306dba02162174721250e0 (patch)
tree7de32a539d81aa25a1601c4661b793023e2bb8f5 /builtin
parent52beafff5310ae9fd0078af38ac2bb9142ac2cfb (diff)
downloadminetest-6027c8d25920fea23a306dba02162174721250e0.tar.gz
minetest-6027c8d25920fea23a306dba02162174721250e0.tar.bz2
minetest-6027c8d25920fea23a306dba02162174721250e0.zip
Add VoxelArea:position, VoxelArea:iter and VoxelArea:iterp
Diffstat (limited to 'builtin')
-rw-r--r--builtin/voxelarea.lua41
1 files changed, 41 insertions, 0 deletions
diff --git a/builtin/voxelarea.lua b/builtin/voxelarea.lua
index dd9af7910..93bbf73a8 100644
--- a/builtin/voxelarea.lua
+++ b/builtin/voxelarea.lua
@@ -44,6 +44,22 @@ function VoxelArea:indexp(p)
return math.floor(i)
end
+function VoxelArea:position(i)
+ local p = {}
+
+ i = i - 1
+
+ p.z = math.floor(i / self.zstride) + self.MinEdge.z
+ i = i % self.zstride
+
+ p.y = math.floor(i / self.ystride) + self.MinEdge.y
+ i = i % self.ystride
+
+ p.x = math.floor(i) + self.MinEdge.x
+
+ return p
+end
+
function VoxelArea:contains(x, y, z)
return (x >= self.MinEdge.x) and (x <= self.MaxEdge.x) and
(y >= self.MinEdge.y) and (y <= self.MaxEdge.y) and
@@ -60,3 +76,28 @@ function VoxelArea:containsi(i)
return (i >= 1) and (i <= self:getVolume())
end
+function VoxelArea:iter(minx, miny, minz, maxx, maxy, maxz)
+ local i = self:index(minx, miny, minz) - 1
+ local last = self:index(maxx, maxy, maxz)
+ local ystride = self.ystride
+ local zstride = self.zstride
+ local yoff = (last+1) % ystride
+ local zoff = (last+1) % zstride
+ local ystridediff = (i - last) % ystride
+ local zstridediff = (i - last) % zstride
+ return function()
+ i = i + 1
+ if i % zstride == zoff then
+ i = i + zstridediff
+ elseif i % ystride == yoff then
+ i = i + ystridediff
+ end
+ if i <= last then
+ return i
+ end
+ end
+end
+
+function VoxelArea:iterp(minp, maxp)
+ return self:iter(minp.x, minp.y, minp.z, maxp.x, maxp.y, maxp.z)
+end