2 MinEdge = {x=1, y=1, z=1},
3 MaxEdge = {x=0, y=0, z=0},
8 function VoxelArea:new(o)
13 local e = o:getExtent()
20 function VoxelArea:getExtent()
21 local MaxEdge, MinEdge = self.MaxEdge, self.MinEdge
23 x = MaxEdge.x - MinEdge.x + 1,
24 y = MaxEdge.y - MinEdge.y + 1,
25 z = MaxEdge.z - MinEdge.z + 1,
29 function VoxelArea:getVolume()
30 local e = self:getExtent()
31 return e.x * e.y * e.z
34 function VoxelArea:index(x, y, z)
35 local MinEdge = self.MinEdge
36 local i = (z - MinEdge.z) * self.zstride +
37 (y - MinEdge.y) * self.ystride +
42 function VoxelArea:indexp(p)
43 local MinEdge = self.MinEdge
44 local i = (p.z - MinEdge.z) * self.zstride +
45 (p.y - MinEdge.y) * self.ystride +
50 function VoxelArea:position(i)
52 local MinEdge = self.MinEdge
56 p.z = math.floor(i / self.zstride) + MinEdge.z
59 p.y = math.floor(i / self.ystride) + MinEdge.y
62 p.x = math.floor(i) + MinEdge.x
67 function VoxelArea:contains(x, y, z)
68 local MaxEdge, MinEdge = self.MaxEdge, self.MinEdge
69 return (x >= MinEdge.x) and (x <= MaxEdge.x) and
70 (y >= MinEdge.y) and (y <= MaxEdge.y) and
71 (z >= MinEdge.z) and (z <= MaxEdge.z)
74 function VoxelArea:containsp(p)
75 local MaxEdge, MinEdge = self.MaxEdge, self.MinEdge
76 return (p.x >= MinEdge.x) and (p.x <= MaxEdge.x) and
77 (p.y >= MinEdge.y) and (p.y <= MaxEdge.y) and
78 (p.z >= MinEdge.z) and (p.z <= MaxEdge.z)
81 function VoxelArea:containsi(i)
82 return (i >= 1) and (i <= self:getVolume())
85 function VoxelArea:iter(minx, miny, minz, maxx, maxy, maxz)
86 local i = self:index(minx, miny, minz) - 1
87 local last = self:index(maxx, maxy, maxz)
88 local ystride = self.ystride
89 local zstride = self.zstride
90 local yoff = (last+1) % ystride
91 local zoff = (last+1) % zstride
92 local ystridediff = (i - last) % ystride
93 local zstridediff = (i - last) % zstride
96 if i % zstride == zoff then
98 elseif i % ystride == yoff then
107 function VoxelArea:iterp(minp, maxp)
108 return self:iter(minp.x, minp.y, minp.z, maxp.x, maxp.y, maxp.z)