import struct
from pkg_resources import parse_version
from kaitaistruct import __version__ as ks_version, KaitaiStruct
if parse_version(ks_version) < parse_version('0.7'):
raise Exception("Incompatible Kaitai Struct Python API: 0.7 or later is required, but you have %s" % (ks_version))
[docs]class Magicavoxel(KaitaiStruct):
SIZE = 256
def __init__(self, _io, _parent=None, _root=None):
self._io = _io
self._parent = _parent
self._root = _root if _root else self
self.magic = self._io.ensure_fixed_contents(struct.pack('4b', 86, 79, 88, 32))
self.section_type = self._io.read_u4le()
self.main_chunkre = self._io.ensure_fixed_contents(struct.pack('4b', 77, 65, 73, 78))
self.chunk_size = self._io.read_u4le()
self.child_chunk_size = self._io.read_u4le()
self.chunk_contents = [None] * (self.chunk_size)
for i in range(self.chunk_size):
self.chunk_contents[i] = self._io.read_u1()
self.model_size = self._root.SizeChunk(self._io, self, self._root)
self.model_voxels = self._root.XyziChunk(self._io, self, self._root)
self.palette = self._root.PaletteChunk(self._io, self, self._root, size=self.SIZE)
[docs] class XyziChunk(KaitaiStruct):
def __init__(self, _io, _parent=None, _root=None):
self._io = _io
self._parent = _parent
self._root = _root if _root else self
self.chunk_identifier = self._io.ensure_fixed_contents(struct.pack('4b', 88, 89, 90, 73))
self.chunk_size = self._io.read_u4le()
self.child_chunk_size = self._io.read_u4le()
self.num_voxels = self._io.read_u4le()
self.voxels = [None] * (self.num_voxels)
for i in range(self.num_voxels):
self.voxels[i] = self._root.Voxels(self._io, self, self._root)
[docs] class Colour(KaitaiStruct):
def __init__(self, _io, _parent=None, _root=None):
self._io = _io
self._parent = _parent
self._root = _root if _root else self
self.r = self._io.read_u1()
self.g = self._io.read_u1()
self.b = self._io.read_u1()
self.a = self._io.read_u1()
[docs] class PaletteChunk(KaitaiStruct):
def __init__(self, _io, _parent=None, _root=None, size=256):
self._io = _io
self._parent = _parent
self._root = _root if _root else self
self.chunk_identifier = self._io.ensure_fixed_contents(struct.pack('4b', 82, 71, 66, 65))
self.chunk_size = self._io.read_u4le()
self.child_chunk_size = self._io.read_u4le()
self.colours = [None] * (size)
for i in range(size):
self.colours[i] = self._root.Colour(self._io, self, self._root)
[docs] class Voxels(KaitaiStruct):
def __init__(self, _io, _parent=None, _root=None):
self._io = _io
self._parent = _parent
self._root = _root if _root else self
self.x = self._io.read_u1()
self.y = self._io.read_u1()
self.z = self._io.read_u1()
self.c = self._io.read_u1()
[docs] class SizeChunk(KaitaiStruct):
def __init__(self, _io, _parent=None, _root=None):
self._io = _io
self._parent = _parent
self._root = _root if _root else self
self.chunk_identifier = self._io.ensure_fixed_contents(struct.pack('4b', 83, 73, 90, 69))
self.chunk_size = self._io.read_u4le()
self.child_chunk_size = self._io.read_u4le()
self.x = self._io.read_u4le()
self.y = self._io.read_u4le()
self.z = self._io.read_u4le()