summaryrefslogtreecommitdiff
path: root/python/examples/kaitai/renderware_binary_stream.py
diff options
context:
space:
mode:
authorAndrew Lamoureux <andrew@vector35.com>2019-03-19 17:32:44 -0400
committerRusty Wagner <rusty@vector35.com>2019-03-20 13:00:17 -0400
commit24ead55316ac8497df5842caf4e1d51f2b799787 (patch)
tree3dfdfae8a076445c9d24bf6d1b40e57f36ebf94a /python/examples/kaitai/renderware_binary_stream.py
parent411acbaa4a1d217e731d3df0b189445117be3b26 (diff)
kaitai: adjustments and rearrangements for python2/3 compat
Diffstat (limited to 'python/examples/kaitai/renderware_binary_stream.py')
-rw-r--r--python/examples/kaitai/renderware_binary_stream.py773
1 files changed, 773 insertions, 0 deletions
diff --git a/python/examples/kaitai/renderware_binary_stream.py b/python/examples/kaitai/renderware_binary_stream.py
new file mode 100644
index 00000000..00b36934
--- /dev/null
+++ b/python/examples/kaitai/renderware_binary_stream.py
@@ -0,0 +1,773 @@
+# This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
+
+from pkg_resources import parse_version
+from .kaitaistruct import __version__ as ks_version, KaitaiStruct, KaitaiStream, BytesIO
+from enum import Enum
+import collections
+
+
+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))
+
+class RenderwareBinaryStream(KaitaiStruct):
+ """
+ .. seealso::
+ Source - https://www.gtamodding.com/wiki/RenderWare_binary_stream_file
+ """
+
+ class Sections(Enum):
+ struct = 1
+ string = 2
+ extension = 3
+ camera = 5
+ texture = 6
+ material = 7
+ material_list = 8
+ atomic_section = 9
+ plane_section = 10
+ world = 11
+ spline = 12
+ matrix = 13
+ frame_list = 14
+ geometry = 15
+ clump = 16
+ light = 18
+ unicode_string = 19
+ atomic = 20
+ texture_native = 21
+ texture_dictionary = 22
+ animation_database = 23
+ image = 24
+ skin_animation = 25
+ geometry_list = 26
+ anim_animation = 27
+ team = 28
+ crowd = 29
+ delta_morph_animation = 30
+ right_to_render = 31
+ multitexture_effect_native = 32
+ multitexture_effect_dictionary = 33
+ team_dictionary = 34
+ platform_independent_texture_dictionary = 35
+ table_of_contents = 36
+ particle_standard_global_data = 37
+ altpipe = 38
+ platform_independent_peds = 39
+ patch_mesh = 40
+ chunk_group_start = 41
+ chunk_group_end = 42
+ uv_animation_dictionary = 43
+ coll_tree = 44
+ metrics_plg = 257
+ spline_plg = 258
+ stereo_plg = 259
+ vrml_plg = 260
+ morph_plg = 261
+ pvs_plg = 262
+ memory_leak_plg = 263
+ animation_plg = 264
+ gloss_plg = 265
+ logo_plg = 266
+ memory_info_plg = 267
+ random_plg = 268
+ png_image_plg = 269
+ bone_plg = 270
+ vrml_anim_plg = 271
+ sky_mipmap_val = 272
+ mrm_plg = 273
+ lod_atomic_plg = 274
+ me_plg = 275
+ lightmap_plg = 276
+ refine_plg = 277
+ skin_plg = 278
+ label_plg = 279
+ particles_plg = 280
+ geomtx_plg = 281
+ synth_core_plg = 282
+ stqpp_plg = 283
+ part_pp_plg = 284
+ collision_plg = 285
+ hanim_plg = 286
+ user_data_plg = 287
+ material_effects_plg = 288
+ particle_system_plg = 289
+ delta_morph_plg = 290
+ patch_plg = 291
+ team_plg = 292
+ crowd_pp_plg = 293
+ mip_split_plg = 294
+ anisotropy_plg = 295
+ gcn_material_plg = 297
+ geometric_pvs_plg = 298
+ xbox_material_plg = 299
+ multi_texture_plg = 300
+ chain_plg = 301
+ toon_plg = 302
+ ptank_plg = 303
+ particle_standard_plg = 304
+ pds_plg = 305
+ prtadv_plg = 306
+ normal_map_plg = 307
+ adc_plg = 308
+ uv_animation_plg = 309
+ character_set_plg = 384
+ nohs_world_plg = 385
+ import_util_plg = 386
+ slerp_plg = 387
+ optim_plg = 388
+ tl_world_plg = 389
+ database_plg = 390
+ raytrace_plg = 391
+ ray_plg = 392
+ library_plg = 393
+ plg_2d = 400
+ tile_render_plg = 401
+ jpeg_image_plg = 402
+ tga_image_plg = 403
+ gif_image_plg = 404
+ quat_plg = 405
+ spline_pvs_plg = 406
+ mipmap_plg = 407
+ mipmapk_plg = 408
+ font_2d = 409
+ intersection_plg = 410
+ tiff_image_plg = 411
+ pick_plg = 412
+ bmp_image_plg = 413
+ ras_image_plg = 414
+ skin_fx_plg = 415
+ vcat_plg = 416
+ path_2d = 417
+ brush_2d = 418
+ object_2d = 419
+ shape_2d = 420
+ scene_2d = 421
+ pick_region_2d = 422
+ object_string_2d = 423
+ animation_plg_2d = 424
+ animation_2d = 425
+ keyframe_2d = 432
+ maestro_2d = 433
+ barycentric = 434
+ platform_independent_texture_dictionary_tk = 435
+ toc_tk = 436
+ tpl_tk = 437
+ altpipe_tk = 438
+ animation_tk = 439
+ skin_split_tookit = 440
+ compressed_key_tk = 441
+ geometry_conditioning_plg = 442
+ wing_plg = 443
+ generic_pipeline_tk = 444
+ lightmap_conversion_tk = 445
+ filesystem_plg = 446
+ dictionary_tk = 447
+ uv_animation_linear = 448
+ uv_animation_parameter = 449
+ bin_mesh_plg = 1294
+ native_data_plg = 1296
+ zmodeler_lock = 61982
+ atomic_visibility_distance = 39055872
+ clump_visibility_distance = 39055873
+ frame_visibility_distance = 39055874
+ pipeline_set = 39056115
+ unused_5 = 39056116
+ texdictionary_link = 39056117
+ specular_material = 39056118
+ unused_8 = 39056119
+ effect_2d = 39056120
+ extra_vert_colour = 39056121
+ collision_model = 39056122
+ gta_hanim = 39056123
+ reflection_material = 39056124
+ breakable = 39056125
+ frame = 39056126
+ unused_16 = 39056127
+ SEQ_FIELDS = ["code", "size", "version", "body"]
+ def __init__(self, _io, _parent=None, _root=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+ self._debug['code']['start'] = self._io.pos()
+ self.code = KaitaiStream.resolve_enum(self._root.Sections, self._io.read_u4le())
+ self._debug['code']['end'] = self._io.pos()
+ self._debug['size']['start'] = self._io.pos()
+ self.size = self._io.read_u4le()
+ self._debug['size']['end'] = self._io.pos()
+ self._debug['version']['start'] = self._io.pos()
+ self.version = self._io.read_u4le()
+ self._debug['version']['end'] = self._io.pos()
+ self._debug['body']['start'] = self._io.pos()
+ _on = self.code
+ if _on == self._root.Sections.geometry:
+ self._raw_body = self._io.read_bytes(self.size)
+ io = KaitaiStream(BytesIO(self._raw_body))
+ self.body = self._root.ListWithHeader(io, self, self._root)
+ self.body._read()
+ elif _on == self._root.Sections.texture_dictionary:
+ self._raw_body = self._io.read_bytes(self.size)
+ io = KaitaiStream(BytesIO(self._raw_body))
+ self.body = self._root.ListWithHeader(io, self, self._root)
+ self.body._read()
+ elif _on == self._root.Sections.geometry_list:
+ self._raw_body = self._io.read_bytes(self.size)
+ io = KaitaiStream(BytesIO(self._raw_body))
+ self.body = self._root.ListWithHeader(io, self, self._root)
+ self.body._read()
+ elif _on == self._root.Sections.texture_native:
+ self._raw_body = self._io.read_bytes(self.size)
+ io = KaitaiStream(BytesIO(self._raw_body))
+ self.body = self._root.ListWithHeader(io, self, self._root)
+ self.body._read()
+ elif _on == self._root.Sections.clump:
+ self._raw_body = self._io.read_bytes(self.size)
+ io = KaitaiStream(BytesIO(self._raw_body))
+ self.body = self._root.ListWithHeader(io, self, self._root)
+ self.body._read()
+ elif _on == self._root.Sections.frame_list:
+ self._raw_body = self._io.read_bytes(self.size)
+ io = KaitaiStream(BytesIO(self._raw_body))
+ self.body = self._root.ListWithHeader(io, self, self._root)
+ self.body._read()
+ else:
+ self.body = self._io.read_bytes(self.size)
+ self._debug['body']['end'] = self._io.pos()
+
+ class StructClump(KaitaiStruct):
+ """
+ .. seealso::
+ Source - https://www.gtamodding.com/wiki/RpClump
+ """
+ SEQ_FIELDS = ["num_atomics", "num_lights", "num_cameras"]
+ def __init__(self, _io, _parent=None, _root=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+ self._debug['num_atomics']['start'] = self._io.pos()
+ self.num_atomics = self._io.read_u4le()
+ self._debug['num_atomics']['end'] = self._io.pos()
+ if self._parent.version >= 208896:
+ self._debug['num_lights']['start'] = self._io.pos()
+ self.num_lights = self._io.read_u4le()
+ self._debug['num_lights']['end'] = self._io.pos()
+
+ if self._parent.version >= 208896:
+ self._debug['num_cameras']['start'] = self._io.pos()
+ self.num_cameras = self._io.read_u4le()
+ self._debug['num_cameras']['end'] = self._io.pos()
+
+
+
+ class StructGeometry(KaitaiStruct):
+ """
+ .. seealso::
+ Source - https://www.gtamodding.com/wiki/RpGeometry
+ """
+ SEQ_FIELDS = ["format", "num_triangles", "num_vertices", "num_morph_targets", "surf_prop", "geometry", "morph_targets"]
+ def __init__(self, _io, _parent=None, _root=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+ self._debug['format']['start'] = self._io.pos()
+ self.format = self._io.read_u4le()
+ self._debug['format']['end'] = self._io.pos()
+ self._debug['num_triangles']['start'] = self._io.pos()
+ self.num_triangles = self._io.read_u4le()
+ self._debug['num_triangles']['end'] = self._io.pos()
+ self._debug['num_vertices']['start'] = self._io.pos()
+ self.num_vertices = self._io.read_u4le()
+ self._debug['num_vertices']['end'] = self._io.pos()
+ self._debug['num_morph_targets']['start'] = self._io.pos()
+ self.num_morph_targets = self._io.read_u4le()
+ self._debug['num_morph_targets']['end'] = self._io.pos()
+ if self._parent.version < 212992:
+ self._debug['surf_prop']['start'] = self._io.pos()
+ self.surf_prop = self._root.SurfaceProperties(self._io, self, self._root)
+ self.surf_prop._read()
+ self._debug['surf_prop']['end'] = self._io.pos()
+
+ if not (self.is_native):
+ self._debug['geometry']['start'] = self._io.pos()
+ self.geometry = self._root.GeometryNonNative(self._io, self, self._root)
+ self.geometry._read()
+ self._debug['geometry']['end'] = self._io.pos()
+
+ self._debug['morph_targets']['start'] = self._io.pos()
+ self.morph_targets = [None] * (self.num_morph_targets)
+ for i in range(self.num_morph_targets):
+ if not 'arr' in self._debug['morph_targets']:
+ self._debug['morph_targets']['arr'] = []
+ self._debug['morph_targets']['arr'].append({'start': self._io.pos()})
+ _t_morph_targets = self._root.MorphTarget(self._io, self, self._root)
+ _t_morph_targets._read()
+ self.morph_targets[i] = _t_morph_targets
+ self._debug['morph_targets']['arr'][i]['end'] = self._io.pos()
+
+ self._debug['morph_targets']['end'] = self._io.pos()
+
+ @property
+ def is_textured(self):
+ if hasattr(self, '_m_is_textured'):
+ return self._m_is_textured if hasattr(self, '_m_is_textured') else None
+
+ self._m_is_textured = (self.format & 4) != 0
+ return self._m_is_textured if hasattr(self, '_m_is_textured') else None
+
+ @property
+ def is_prelit(self):
+ if hasattr(self, '_m_is_prelit'):
+ return self._m_is_prelit if hasattr(self, '_m_is_prelit') else None
+
+ self._m_is_prelit = (self.format & 8) != 0
+ return self._m_is_prelit if hasattr(self, '_m_is_prelit') else None
+
+ @property
+ def is_textured2(self):
+ if hasattr(self, '_m_is_textured2'):
+ return self._m_is_textured2 if hasattr(self, '_m_is_textured2') else None
+
+ self._m_is_textured2 = (self.format & 128) != 0
+ return self._m_is_textured2 if hasattr(self, '_m_is_textured2') else None
+
+ @property
+ def is_native(self):
+ if hasattr(self, '_m_is_native'):
+ return self._m_is_native if hasattr(self, '_m_is_native') else None
+
+ self._m_is_native = (self.format & 16777216) != 0
+ return self._m_is_native if hasattr(self, '_m_is_native') else None
+
+
+ class GeometryNonNative(KaitaiStruct):
+ SEQ_FIELDS = ["prelit_colors", "tex_coords", "triangles"]
+ def __init__(self, _io, _parent=None, _root=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+ if self._parent.is_prelit:
+ self._debug['prelit_colors']['start'] = self._io.pos()
+ self.prelit_colors = [None] * (self._parent.num_vertices)
+ for i in range(self._parent.num_vertices):
+ if not 'arr' in self._debug['prelit_colors']:
+ self._debug['prelit_colors']['arr'] = []
+ self._debug['prelit_colors']['arr'].append({'start': self._io.pos()})
+ _t_prelit_colors = self._root.Rgba(self._io, self, self._root)
+ _t_prelit_colors._read()
+ self.prelit_colors[i] = _t_prelit_colors
+ self._debug['prelit_colors']['arr'][i]['end'] = self._io.pos()
+
+ self._debug['prelit_colors']['end'] = self._io.pos()
+
+ if ((self._parent.is_textured) or (self._parent.is_textured2)) :
+ self._debug['tex_coords']['start'] = self._io.pos()
+ self.tex_coords = [None] * (self._parent.num_vertices)
+ for i in range(self._parent.num_vertices):
+ if not 'arr' in self._debug['tex_coords']:
+ self._debug['tex_coords']['arr'] = []
+ self._debug['tex_coords']['arr'].append({'start': self._io.pos()})
+ _t_tex_coords = self._root.TexCoord(self._io, self, self._root)
+ _t_tex_coords._read()
+ self.tex_coords[i] = _t_tex_coords
+ self._debug['tex_coords']['arr'][i]['end'] = self._io.pos()
+
+ self._debug['tex_coords']['end'] = self._io.pos()
+
+ self._debug['triangles']['start'] = self._io.pos()
+ self.triangles = [None] * (self._parent.num_triangles)
+ for i in range(self._parent.num_triangles):
+ if not 'arr' in self._debug['triangles']:
+ self._debug['triangles']['arr'] = []
+ self._debug['triangles']['arr'].append({'start': self._io.pos()})
+ _t_triangles = self._root.Triangle(self._io, self, self._root)
+ _t_triangles._read()
+ self.triangles[i] = _t_triangles
+ self._debug['triangles']['arr'][i]['end'] = self._io.pos()
+
+ self._debug['triangles']['end'] = self._io.pos()
+
+
+ class StructGeometryList(KaitaiStruct):
+ """
+ .. seealso::
+ Source - https://www.gtamodding.com/wiki/Geometry_List_(RW_Section)#Structure
+ """
+ SEQ_FIELDS = ["num_geometries"]
+ def __init__(self, _io, _parent=None, _root=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+ self._debug['num_geometries']['start'] = self._io.pos()
+ self.num_geometries = self._io.read_u4le()
+ self._debug['num_geometries']['end'] = self._io.pos()
+
+
+ class Rgba(KaitaiStruct):
+ SEQ_FIELDS = ["r", "g", "b", "a"]
+ def __init__(self, _io, _parent=None, _root=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+ self._debug['r']['start'] = self._io.pos()
+ self.r = self._io.read_u1()
+ self._debug['r']['end'] = self._io.pos()
+ self._debug['g']['start'] = self._io.pos()
+ self.g = self._io.read_u1()
+ self._debug['g']['end'] = self._io.pos()
+ self._debug['b']['start'] = self._io.pos()
+ self.b = self._io.read_u1()
+ self._debug['b']['end'] = self._io.pos()
+ self._debug['a']['start'] = self._io.pos()
+ self.a = self._io.read_u1()
+ self._debug['a']['end'] = self._io.pos()
+
+
+ class Sphere(KaitaiStruct):
+ SEQ_FIELDS = ["x", "y", "z", "radius"]
+ def __init__(self, _io, _parent=None, _root=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+ self._debug['x']['start'] = self._io.pos()
+ self.x = self._io.read_f4le()
+ self._debug['x']['end'] = self._io.pos()
+ self._debug['y']['start'] = self._io.pos()
+ self.y = self._io.read_f4le()
+ self._debug['y']['end'] = self._io.pos()
+ self._debug['z']['start'] = self._io.pos()
+ self.z = self._io.read_f4le()
+ self._debug['z']['end'] = self._io.pos()
+ self._debug['radius']['start'] = self._io.pos()
+ self.radius = self._io.read_f4le()
+ self._debug['radius']['end'] = self._io.pos()
+
+
+ class MorphTarget(KaitaiStruct):
+ SEQ_FIELDS = ["bounding_sphere", "has_vertices", "has_normals", "vertices", "normals"]
+ def __init__(self, _io, _parent=None, _root=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+ self._debug['bounding_sphere']['start'] = self._io.pos()
+ self.bounding_sphere = self._root.Sphere(self._io, self, self._root)
+ self.bounding_sphere._read()
+ self._debug['bounding_sphere']['end'] = self._io.pos()
+ self._debug['has_vertices']['start'] = self._io.pos()
+ self.has_vertices = self._io.read_u4le()
+ self._debug['has_vertices']['end'] = self._io.pos()
+ self._debug['has_normals']['start'] = self._io.pos()
+ self.has_normals = self._io.read_u4le()
+ self._debug['has_normals']['end'] = self._io.pos()
+ if self.has_vertices != 0:
+ self._debug['vertices']['start'] = self._io.pos()
+ self.vertices = [None] * (self._parent.num_vertices)
+ for i in range(self._parent.num_vertices):
+ if not 'arr' in self._debug['vertices']:
+ self._debug['vertices']['arr'] = []
+ self._debug['vertices']['arr'].append({'start': self._io.pos()})
+ _t_vertices = self._root.Vector3d(self._io, self, self._root)
+ _t_vertices._read()
+ self.vertices[i] = _t_vertices
+ self._debug['vertices']['arr'][i]['end'] = self._io.pos()
+
+ self._debug['vertices']['end'] = self._io.pos()
+
+ if self.has_normals != 0:
+ self._debug['normals']['start'] = self._io.pos()
+ self.normals = [None] * (self._parent.num_vertices)
+ for i in range(self._parent.num_vertices):
+ if not 'arr' in self._debug['normals']:
+ self._debug['normals']['arr'] = []
+ self._debug['normals']['arr'].append({'start': self._io.pos()})
+ _t_normals = self._root.Vector3d(self._io, self, self._root)
+ _t_normals._read()
+ self.normals[i] = _t_normals
+ self._debug['normals']['arr'][i]['end'] = self._io.pos()
+
+ self._debug['normals']['end'] = self._io.pos()
+
+
+
+ class SurfaceProperties(KaitaiStruct):
+ """
+ .. seealso::
+ Source - https://www.gtamodding.com/wiki/RpGeometry
+ """
+ SEQ_FIELDS = ["ambient", "specular", "diffuse"]
+ def __init__(self, _io, _parent=None, _root=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+ self._debug['ambient']['start'] = self._io.pos()
+ self.ambient = self._io.read_f4le()
+ self._debug['ambient']['end'] = self._io.pos()
+ self._debug['specular']['start'] = self._io.pos()
+ self.specular = self._io.read_f4le()
+ self._debug['specular']['end'] = self._io.pos()
+ self._debug['diffuse']['start'] = self._io.pos()
+ self.diffuse = self._io.read_f4le()
+ self._debug['diffuse']['end'] = self._io.pos()
+
+
+ class StructFrameList(KaitaiStruct):
+ """
+ .. seealso::
+ Source - https://www.gtamodding.com/wiki/Frame_List_(RW_Section)#Structure
+ """
+ SEQ_FIELDS = ["num_frames", "frames"]
+ def __init__(self, _io, _parent=None, _root=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+ self._debug['num_frames']['start'] = self._io.pos()
+ self.num_frames = self._io.read_u4le()
+ self._debug['num_frames']['end'] = self._io.pos()
+ self._debug['frames']['start'] = self._io.pos()
+ self.frames = [None] * (self.num_frames)
+ for i in range(self.num_frames):
+ if not 'arr' in self._debug['frames']:
+ self._debug['frames']['arr'] = []
+ self._debug['frames']['arr'].append({'start': self._io.pos()})
+ _t_frames = self._root.Frame(self._io, self, self._root)
+ _t_frames._read()
+ self.frames[i] = _t_frames
+ self._debug['frames']['arr'][i]['end'] = self._io.pos()
+
+ self._debug['frames']['end'] = self._io.pos()
+
+
+ class Matrix(KaitaiStruct):
+ """
+ .. seealso::
+ Source - https://www.gtamodding.com/wiki/Frame_List_(RW_Section)#Structure
+ """
+ SEQ_FIELDS = ["entries"]
+ def __init__(self, _io, _parent=None, _root=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+ self._debug['entries']['start'] = self._io.pos()
+ self.entries = [None] * (3)
+ for i in range(3):
+ if not 'arr' in self._debug['entries']:
+ self._debug['entries']['arr'] = []
+ self._debug['entries']['arr'].append({'start': self._io.pos()})
+ _t_entries = self._root.Vector3d(self._io, self, self._root)
+ _t_entries._read()
+ self.entries[i] = _t_entries
+ self._debug['entries']['arr'][i]['end'] = self._io.pos()
+
+ self._debug['entries']['end'] = self._io.pos()
+
+
+ class Vector3d(KaitaiStruct):
+ """
+ .. seealso::
+ Source - https://www.gtamodding.com/wiki/Frame_List_(RW_Section)#Structure
+ """
+ SEQ_FIELDS = ["x", "y", "z"]
+ def __init__(self, _io, _parent=None, _root=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+ self._debug['x']['start'] = self._io.pos()
+ self.x = self._io.read_f4le()
+ self._debug['x']['end'] = self._io.pos()
+ self._debug['y']['start'] = self._io.pos()
+ self.y = self._io.read_f4le()
+ self._debug['y']['end'] = self._io.pos()
+ self._debug['z']['start'] = self._io.pos()
+ self.z = self._io.read_f4le()
+ self._debug['z']['end'] = self._io.pos()
+
+
+ class ListWithHeader(KaitaiStruct):
+ """Typical structure used by many data types in RenderWare binary
+ stream. Substream contains a list of binary stream entries,
+ first entry always has type "struct" and carries some specific
+ binary data it in, determined by the type of parent. All other
+ entries, beside the first one, are normal, self-describing
+ records.
+ """
+ SEQ_FIELDS = ["code", "header_size", "version", "header", "entries"]
+ def __init__(self, _io, _parent=None, _root=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+ self._debug['code']['start'] = self._io.pos()
+ self.code = self._io.ensure_fixed_contents(b"\x01\x00\x00\x00")
+ self._debug['code']['end'] = self._io.pos()
+ self._debug['header_size']['start'] = self._io.pos()
+ self.header_size = self._io.read_u4le()
+ self._debug['header_size']['end'] = self._io.pos()
+ self._debug['version']['start'] = self._io.pos()
+ self.version = self._io.read_u4le()
+ self._debug['version']['end'] = self._io.pos()
+ self._debug['header']['start'] = self._io.pos()
+ _on = self._parent.code
+ if _on == self._root.Sections.geometry:
+ self._raw_header = self._io.read_bytes(self.header_size)
+ io = KaitaiStream(BytesIO(self._raw_header))
+ self.header = self._root.StructGeometry(io, self, self._root)
+ self.header._read()
+ elif _on == self._root.Sections.texture_dictionary:
+ self._raw_header = self._io.read_bytes(self.header_size)
+ io = KaitaiStream(BytesIO(self._raw_header))
+ self.header = self._root.StructTextureDictionary(io, self, self._root)
+ self.header._read()
+ elif _on == self._root.Sections.geometry_list:
+ self._raw_header = self._io.read_bytes(self.header_size)
+ io = KaitaiStream(BytesIO(self._raw_header))
+ self.header = self._root.StructGeometryList(io, self, self._root)
+ self.header._read()
+ elif _on == self._root.Sections.clump:
+ self._raw_header = self._io.read_bytes(self.header_size)
+ io = KaitaiStream(BytesIO(self._raw_header))
+ self.header = self._root.StructClump(io, self, self._root)
+ self.header._read()
+ elif _on == self._root.Sections.frame_list:
+ self._raw_header = self._io.read_bytes(self.header_size)
+ io = KaitaiStream(BytesIO(self._raw_header))
+ self.header = self._root.StructFrameList(io, self, self._root)
+ self.header._read()
+ else:
+ self.header = self._io.read_bytes(self.header_size)
+ self._debug['header']['end'] = self._io.pos()
+ self._debug['entries']['start'] = self._io.pos()
+ self.entries = []
+ i = 0
+ while not self._io.is_eof():
+ if not 'arr' in self._debug['entries']:
+ self._debug['entries']['arr'] = []
+ self._debug['entries']['arr'].append({'start': self._io.pos()})
+ _t_entries = RenderwareBinaryStream(self._io)
+ _t_entries._read()
+ self.entries.append(_t_entries)
+ self._debug['entries']['arr'][len(self.entries) - 1]['end'] = self._io.pos()
+ i += 1
+
+ self._debug['entries']['end'] = self._io.pos()
+
+
+ class Triangle(KaitaiStruct):
+ SEQ_FIELDS = ["vertex2", "vertex1", "material_id", "vertex3"]
+ def __init__(self, _io, _parent=None, _root=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+ self._debug['vertex2']['start'] = self._io.pos()
+ self.vertex2 = self._io.read_u2le()
+ self._debug['vertex2']['end'] = self._io.pos()
+ self._debug['vertex1']['start'] = self._io.pos()
+ self.vertex1 = self._io.read_u2le()
+ self._debug['vertex1']['end'] = self._io.pos()
+ self._debug['material_id']['start'] = self._io.pos()
+ self.material_id = self._io.read_u2le()
+ self._debug['material_id']['end'] = self._io.pos()
+ self._debug['vertex3']['start'] = self._io.pos()
+ self.vertex3 = self._io.read_u2le()
+ self._debug['vertex3']['end'] = self._io.pos()
+
+
+ class Frame(KaitaiStruct):
+ """
+ .. seealso::
+ Source - https://www.gtamodding.com/wiki/Frame_List_(RW_Section)#Structure
+ """
+ SEQ_FIELDS = ["rotation_matrix", "position", "cur_frame_idx", "matrix_creation_flags"]
+ def __init__(self, _io, _parent=None, _root=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+ self._debug['rotation_matrix']['start'] = self._io.pos()
+ self.rotation_matrix = self._root.Matrix(self._io, self, self._root)
+ self.rotation_matrix._read()
+ self._debug['rotation_matrix']['end'] = self._io.pos()
+ self._debug['position']['start'] = self._io.pos()
+ self.position = self._root.Vector3d(self._io, self, self._root)
+ self.position._read()
+ self._debug['position']['end'] = self._io.pos()
+ self._debug['cur_frame_idx']['start'] = self._io.pos()
+ self.cur_frame_idx = self._io.read_s4le()
+ self._debug['cur_frame_idx']['end'] = self._io.pos()
+ self._debug['matrix_creation_flags']['start'] = self._io.pos()
+ self.matrix_creation_flags = self._io.read_u4le()
+ self._debug['matrix_creation_flags']['end'] = self._io.pos()
+
+
+ class TexCoord(KaitaiStruct):
+ SEQ_FIELDS = ["u", "v"]
+ def __init__(self, _io, _parent=None, _root=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+ self._debug['u']['start'] = self._io.pos()
+ self.u = self._io.read_f4le()
+ self._debug['u']['end'] = self._io.pos()
+ self._debug['v']['start'] = self._io.pos()
+ self.v = self._io.read_f4le()
+ self._debug['v']['end'] = self._io.pos()
+
+
+ class StructTextureDictionary(KaitaiStruct):
+ SEQ_FIELDS = ["num_textures"]
+ def __init__(self, _io, _parent=None, _root=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+ self._debug['num_textures']['start'] = self._io.pos()
+ self.num_textures = self._io.read_u4le()
+ self._debug['num_textures']['end'] = self._io.pos()
+
+
+