def write(self, stream, resource=None): s = StreamWriter(stream) s.u32(self.ID) s.u32(0) clip_stream = BytesIO() self.clip.write(clip_stream) s.u32(clip_stream.tell()) clip_stream.seek(0, SEEK_SET) clip_ptr = StreamPtr.begin_write(s, True) ik_ptr = StreamPtr.begin_write(s, True) actor_ptr = StreamPtr.begin_write(s, True) event_ptr = StreamPtr.begin_write(s, True) s.u32(self.unknown1) s.u32(self.unknown2) vector_ptr = StreamPtr.begin_write(s, True) for i in range(16): s.u8(self.unknown3[i]) clip_ptr.end() stream.write(clip_stream.read()) s.align(char=self.PADDING_CHAR) if self.ik_info is not None: ik_ptr.end() self.ik_info.write(stream) s.align(char=self.PADDING_CHAR) actor_ptr.end() s.zs(self.actor_name) s.align(char=self.PADDING_CHAR) event_ptr.end() self.event_table.write(stream) s.align(char=self.PADDING_CHAR) vector_ptr.end() for i in range(4): s.f32(self.vector[i])
def write(self, stream, resource=None): s = StreamWriter(stream) s.u32(self.ID) s.u32(0) clip_stream = BytesIO() self.clip.write(clip_stream) s.u32(clip_stream.tell()) clip_stream.seek(0, SEEK_SET) clip_ptr = StreamPtr.begin_write(s, True) ik_ptr = StreamPtr.begin_write(s, True) actor_ptr = StreamPtr.begin_write(s, True) event_ptr = StreamPtr.begin_write(s, True) s.u32(self.unknown1) s.u32(self.unknown2) vector_ptr = StreamPtr.begin_write(s, True) for i in range(16): s.u8(self.unknown3[i]) clip_ptr.end() stream.write(clip_stream.read()) s.align(char=self.PADDING_CHAR) if self.ik_info != None: ik_ptr.end() self.ik_info.write(stream) s.align(char=self.PADDING_CHAR) actor_ptr.end() s.zs(self.actor_name) s.align(char=self.PADDING_CHAR) event_ptr.end() self.event_table.write(stream) s.align(char=self.PADDING_CHAR) vector_ptr.end() for i in range(4): s.f32(self.vector[i])
def write(self, stream, rcol): s = StreamWriter(stream) len_offset = stream.tell() s.u32(0) start = stream.tell() s.hash(self.name) s.u32(rcol.get_block_index(self.material)) s.u32(rcol.get_block_index(self.vertex_format)) s.u32(rcol.get_block_index(self.vertex_buffer)) s.u32(rcol.get_block_index(self.index_buffer)) flags = self.primitive_type flags |= (self.flags << 8) s.u32(flags) s.u32(self.stream_offset) s.i32(self.start_vertex) s.i32(self.start_index) s.i32(self.min_vertex_index) s.i32(self.vertex_count) s.i32(self.primitive_count) self.bounds.write(stream) s.u32(rcol.get_block_index(self.skin_controller)) s.i32(len(self.bone_references)) for bone in self.bone_references: s.u32(bone) s.u32(rcol.get_block_index(self.scale_offsets)) s.i32(len(self.states)) for state in self.states: state.write_rcol(self, rcol) if self.parent.version > ModelLod.VERSION.DEFAULT: s.hash(self.parent_name) for i in range(3): s.f32(self.mirror_plane_normal[i]) s.f32(self.mirror_plane_offset) end = stream.tell() stream.seek(len_offset, SEEK_SET) s.u32(end - start) stream.seek(end, SEEK_SET)
def write(self, stream, resources=None): s = StreamWriter(stream) s.u32(self.version) tgi = TGIList() tgi.begin_write(stream) if self.version >= 0x00000007: ProductBase.write_presets(stream,self.presets,tgi) self.product_info.write(stream,tgi) s.i32(tgi.get_resource_index(self.model)) s.i32(tgi.get_resource_index(self.diagonal_model)) s.i32(tgi.get_resource_index(self.post_model)) s.i32(self.post_tile_spacing) s.i8(1 if self.can_walk_over else 0) if self.version >= 0x00000008: if self.version >= 0x0000000A: s.i8(1 if self.should_not_get_thick_snow else 0) s.i8(1 if self.snow_post_shape_is_circle else 0) s.f32(self.snow_thickness_post_scale_factor) s.f32(self.snow_thickness_rail_scale_factor) s.f32(self.snow_thickness_post_vertical_offset) s.f32(self.snow_thickness_rail_vertical_offset) s.i8(1 if self.has_wall else 0) if self.version < 0x0000000A or self.has_wall: s.i8(1 if self.raise_fence_geometry_above_wall else 0) s.i32(tgi.get_resource_index(self.wall)) tgi.end_write(stream)
def write_rcol(self, stream, rcol): s = StreamWriter(stream) def write_names(slots): for slot in slots: s.hash(slot.name) def write_bones(slots): for slot in slots: s.hash(slot.bone_name) def write_transforms(slots): for slot in slots: s.m43(slot.transform) def write_offsets(slots): if any(slots): s.i32(len(list(filter(lambda slot: slot.offset != None, slots)))) for i, slot in enumerate(slots): if slot.offset != None: s.i32(i) for i in range(3): s.i32(slot.offset.position) for i in range(3): s.i32(slot.offset.rotation) self.write_tag(stream) s.u32(self.version) s.i32(len(self.routing_slots)) s.i32(len(self.container_slots)) s.i32(len(self.effect_slots)) s.i32(len(self.target_slots)) s.i32(len(self.cone_slots)) write_names(self.routing_slots) write_bones(self.routing_slots) write_transforms(self.routing_slots) write_offsets(self.routing_slots) write_names(self.container_slots) write_bones(self.container_slots) for slot in self.container_slots: s.u32(slot.flags) write_transforms(self.container_slots) write_offsets(self.container_slots) write_names(self.effect_slots) write_bones(self.effect_slots) write_transforms(self.effect_slots) write_offsets(self.effect_slots) write_names(self.target_slots) write_bones(self.target_slots) write_transforms(self.target_slots) write_offsets(self.target_slots) write_names(self.cone_slots) write_bones(self.cone_slots) write_transforms(self.cone_slots) for slot in self.cone_slots: s.f32(slot.radius) s.f32(slot.angle) write_offsets(self.cone_slots)
def write(self, stream, resources): s = StreamWriter(stream) s.u32(resources.get_block_index(self.model, RCOL.Reference.PUBLIC)) s.u32(self.flags) s.u16(self.id) s.u16(int(self.is_sunshadow)) s.f32(self.min_z) s.f32(self.max_z)
def write(self, stream, resource=None): Light.write(self, stream) s = StreamWriter(stream) for i in range(3): s.f32(self.at[i]) s.f32(self.falloff_angle) s.f32(self.shade_light_rig_multiplier) s.f32(self.bottom_angle) for i in range(3): s.f32(self.shade_colour[i])
def write_rcol(self, stream, rcol): self.write_tag(stream) s = StreamWriter(stream) s.u32(self.version) s.tgi(self.rig.key, 'ITG') s.f32(self.unknown) for i in range(self.RESERVED_COUNT): s.u8(self.reserved[i]) s.u32(len(self.bone_weights)) for val in self.bone_weights: s.f32(val)
def write(self, stream, resource=None): s = StreamWriter(stream) self.frame_data_ptr = StreamPtr.begin_write(s) s.u32(self.track_key) s.f32(self.offset) s.f32(self.scale) s.u16(self.frame_count) self.flags.write(stream) s.u8(self.type) return self
def write(self, stream, resource=None): Event.write(self, stream) s = StreamWriter(stream) s.hash(self.prop_actor_name) s.hash(self.object_actor_name) s.hash(self.slot_name) s.u32(self.unknown4) for i in range(4): for j in range(4): s.f32(self.matrix[i][j])
def write(self, stream, resources=None): s = StreamWriter(stream) indexedFloats = [] curves = [] curveMap = {} for t in self.tracks: assert isinstance(t, Track) for curve in t: assert isinstance(curve, Curve) if len(curve.frames) > self.max_frame_count: self.max_frame_count = len(curve.frames) + 1 cdi = CurveDataInfo() curve.flags.static = len(curve.frames) == 0 cdi.frame_count = len(curve.frames) cdi.process_frames(curve.frames) cdi.flags = curve.flags cdi.type = curve.type cdi.track_key = t.track_key curveMap[cdi] = curve.frames curves.append(cdi) cCurves = len(curves) cFloats = len(indexedFloats) #Begin writing... s.chars('_pilC3S_') s.u32(self.version) s.u32(self.unknown1) s.f32(self.frame_duration) s.u16(self.max_frame_count) s.u16(self.unknown2) s.u32(cCurves) s.u32(cFloats) curveOffset = StreamPtr.begin_write(s) frameOffset = StreamPtr.begin_write(s) nameOffset = StreamPtr.begin_write(s) srcNameOffset = StreamPtr.begin_write(s) curveOffset.end() for curve in curves: curve.write(stream) nameOffset.end() s.zs(self.name) srcNameOffset.end() s.zs(self.source_file_name) frameOffset.end() for curve in curves: curve.frame_data_ptr.end() frames = curveMap[curve] for f in frames: f.write(stream, curve, indexedFloats) return self
def write(self, stream, resource=None): s = StreamWriter(stream) s.u32(self.version) s.u32(len(self.bones)) for bone in self.bones: s.s7(bone.name, 16, '>') s.u32(len(self.bones)) for bone in self.bones: for i in range(3): for j in range(4): s.f32(bone[i][j])
def write(self, stream, resources=None): s = StreamWriter(stream) s.u16(self.TAG) s.u32(self.id) s.f32(self.time_code) s.f32(self.unknown1) s.f32(self.unknown2) s.u32(self.unknown3) s.u32(len(self.name)) s.zs(self.name) s.align()
def write(self, stream, resource=None): s = StreamWriter(stream) s.u32(self.type) for i in range(3): s.f32(self.origin[i]) for i in range(3): s.f32(self.normal[i]) for i in range(3): s.f32(self.x_axis[i]) for i in range(3): s.f32(self.y_axis[i]) s.f32(self.pair_offset)
def write(self, stream, resources=None): s = StreamWriter(stream) indexedFloats = [] curves = [] curveMap = {} for t in self.tracks: assert isinstance(t,Track) for curve in t: assert isinstance(curve,Curve) if len(curve.frames) > self.max_frame_count: self.max_frame_count = len(curve.frames) + 1 cdi = CurveDataInfo() curve.flags.static = len(curve.frames) == 0 cdi.frame_count = len(curve.frames) cdi.process_frames(curve.frames) cdi.flags = curve.flags cdi.type = curve.type cdi.track_key = t.track_key curveMap[cdi] = curve.frames curves.append(cdi) cCurves = len(curves) cFloats = len(indexedFloats) #Begin writing... s.chars('_pilC3S_') s.u32(self.version) s.u32(self.unknown1) s.f32(self.frame_duration) s.u16(self.max_frame_count) s.u16(self.unknown2) s.u32(cCurves) s.u32(cFloats) curveOffset = StreamPtr.begin_write(s) frameOffset = StreamPtr.begin_write(s) nameOffset = StreamPtr.begin_write(s) srcNameOffset = StreamPtr.begin_write(s) curveOffset.end() for curve in curves: curve.write(stream) nameOffset.end() s.zs(self.name) srcNameOffset.end() s.zs(self.source_file_name) frameOffset.end() for curve in curves: curve.frame_data_ptr.end() frames = curveMap[curve] for f in frames: f.write(stream, curve, indexedFloats) return self
def write_rcol(self, stream, rcol): s = StreamWriter(stream) self.write_tag(stream) s.u32(self.version) s.f32(self.framerate) cFrames = len(self.frames) s.i32(cFrames) data_pos = stream.tell() + (cFrames * 4) for frame in self.frames: s.u32(data_pos) data_pos += len(frame) for frame in self.frames: stream.write(frame)
def write_rcol(self, stream, rcol): s = StreamWriter(stream) self.write_tag(stream) s.u32(self.version) s.i32(len(self.lods)) self.bounds.write(stream) if self.version >= self.VERSION.EXTENDED: s.i32(len(self.extra_bounds)) for extra in self.extra_bounds: extra.write(stream) s.u32(self.fade_type) s.f32(self.custom_fade_distance) for lod in self.lods: lod.write_rcol(stream, rcol)
def write(self, stream, resource=None): s = StreamWriter(stream) self.bounds.clear() s.hash(self.name) s.i8(self.priority) s.u32(self.footprint_type_flags) s.i32(len(self.points)) for point in self.points: self.bounds.add(point) s.f32(point[0]) s.f32(point[1]) s.u32(self.allow_intersection_flags) s.u32(self.surface_type_flags) s.u32(self.surface_attribute_flags) s.i8(self.level_offset) if self.ftpt.version >= Footprint.VERSION.EXTENDED: s.f32(self.elevation_offset) self.bounds.write(stream)
def write_rcol(self, stream, rcol): s = StreamWriter(stream) self.write_tag(stream) s.u32(self.version) tgi = TGIList(32, 'TGI') tgi.begin_write(stream) s.hash(self.shader) if self.shader: self.material.write(stream, tgi) s.u32(self.merge_group) s.u32(self.sort_order) s.u32(len(self.vertices)) self.vertex_format.from_vertex(self.vertices[0]) self.vertex_format.write(stream) for vertex in self.vertices: uv_index = 0 for declaration in self.vertex_format.declarations: if declaration.usage == self.VertexFormat.Declaration.USAGE.POSITION: for i in range(3): s.f32(vertex.position) elif declaration.usage == self.VertexFormat.Declaration.USAGE.NORMAL: for i in range(3): s.f32(vertex.normal) elif declaration.usage == self.VertexFormat.Declaration.USAGE.UV: for i in range(2): s.f32(vertex.uv[uv_index]) uv_index += 1 elif declaration.usage == self.VertexFormat.Declaration.USAGE.BLEND_INDEX: for i in range(4): s.i8(vertex.blend_indices) elif declaration.usage == self.VertexFormat.Declaration.USAGE.BLEND_WEIGHT: for i in range(4): s.f32(vertex.blend_weights) elif declaration.usage == self.VertexFormat.Declaration.USAGE.TANGENT: for i in range(3): s.f32(vertex.tangents) elif declaration.usage == self.VertexFormat.Declaration.USAGE.COLOUR: for i in range(4): s.i8(vertex.colour) elif declaration.usage == self.VertexFormat.Declaration.USAGE.ID: s.u32(vertex.id) s.u32(tgi.get_resource_index(self.skin_controller)) s.u32(len(self.bones)) for bone in self.bones: s.u32(bone)
def write(self, stream, resource=None): s = StreamWriter(stream) s.u32(self.version) tgi = TGIList('igt', 8, False) tgi.begin_write(stream) for preset in self.presets: preset.write(stream) s.s7(self.part_name, 16, '>') s.f32(self.display_index) s.u8(self.has_unique_texture_space) s.u32(self.body_type) s.u32(self.part_flags) s.u32(self.age_gender_flags) s.u32(self.clothing_category) s.i8(tgi.get_resource_index(self.naked_cas_part)) s.i8(tgi.get_resource_index(self.base_cas_part)) s.i8(tgi.get_resource_index(self.blend_fat)) s.i8(tgi.get_resource_index(self.blend_fit)) s.i8(tgi.get_resource_index(self.blend_thin)) s.i8(tgi.get_resource_index(self.blend_special)) s.u32(self.draw_layer) s.i8(len(self.sources)) for source in self.sources: s.i8(tgi.get_resource_index(source)) s.i8(len(self.lod_infos)) for lod_info in self.lod_infos: lod_info.write(stream) s.i8(len(self.diffuse_refs)) for diffuse_ref in self.diffuse_refs: s.i8(tgi.get_resource_index(diffuse_ref)) s.i8(len(self.specular_refs)) for specular_ref in self.specular_refs: s.i8(tgi.get_resource_index(specular_ref)) s.u8(len(self.secondary_diffuse_refs)) for block in self.secondary_diffuse_refs: s.u8(tgi.get_resource_index(block)) s.u8(len(self.secondary_specular_refs)) for block in self.secondary_specular_refs: s.u8(tgi.get_resource_index(block)) s.u8(len(self.slot_poses)) for block in self.slot_poses: s.u8(tgi.get_resource_index(block)) s.s7(self.shoe_material, 16, '>') tgi.end_write(stream)
def write(self, stream, resource=None): Light.write(self, stream) s = StreamWriter(stream) for i in range(3): s.f32(self.at[i]) s.f32(self.falloff_angle) s.f32(self.blur_scale)
def write(self, stream, resource=None): Light.write(self, stream) s = StreamWriter(stream) for i in range(3): s.f32(self.at[i]) s.f32(self.tube_length) s.f32(self.blur_scale)
def write(self, stream, resource=None): s = StreamWriter(stream) for i in range(3): s.f32(self.transform[i]) for i in range(3): s.f32(self.colour[i]) s.f32(self.intensity)
def write_data(self, stream, keys): s = StreamWriter(stream) self.pointer.end() if self.type_code == self.TYPE.FLOAT: if self.size32 == 1: s.f32(self.value) else: for f in self.value: s.f32(f) elif self.type_code == self.TYPE.INT: if self.size32 == 1: s.i32(self.value) else: for i in self.value: s.i32(i) elif self.type_code == self.TYPE.TEXTURE: if not keys == None: s.u32(keys.get_resource_index(self.value)) s.u32(0) s.u32(0) s.u32(0) else: s.tgi(self.value, 'ITG') s.u32(0)
def write(self, stream, resources=None): s = StreamWriter(stream) for i in range(3): s.f32(self.position[i]) for i in range(3): s.f32(self.scale[i]) for i in range(4): s.f32(self.orientation[i])
def write(self, stream, resource=None): Light.write(self, stream) s = StreamWriter(stream) for i in range(3): s.f32(self.at[i]) for i in range(3): s.f32(self.right[i]) s.f32(self.radius)
def write_rcol(self, stream, rcol): s = StreamWriter(stream) s.u32(self.version) s.i32(len(self.deltas)) for delta in self.deltas: s.hash(delta.bone_name) for i in range(3): s.f32(delta.offset[i]) for i in range(3): s.f32(delta.scale[i]) for i in range(4): s.f32(delta.rotation[i])
def write_rcol(self, stream, rcol): s = StreamWriter(stream) s.u32(self.flags) s.u32(self.priority) s.u32(0) s.f32(self.blend_in_time) s.f32(self.blend_out_time) s.u32(0) s.f32(self.speed) s.u32(rcol.get_block_index(self.actor, ActorDefinition)) s.u32(self.timing_priority) s.u32(0x00000010) for i in range(5): s.u32(0) s.u32(DEADBEEF) MulticastDecisionGraphNode.write(self, stream, rcol)
def write(self, stream, resource=None): s = StreamWriter(stream) s.u32(self.version_major) s.u32(self.version_minor) s.i32(len(self.bones)) for bone in self.bones: for i in range(3): s.f32(bone.position[i]) for i in range(4): s.f32(bone.orientation[i]) for i in range(3): s.f32(bone.scale[i]) assert bone.name != None, "Bone %s must have a name" s.p32(bone.name) s.i32(-1 if not bone.opposite in self.bones else self.bones.index(bone.opposite)) s.i32(-1 if not bone.parent in self.bones else self.bones.index(bone.parent)) s.u32(FNV32.hash(bone.name)) s.u32(bone.flags) if self.version_major >= 4: s.p32(self.name) s.i32(len(self.ik_chains)) for chain in self.ik_chains: chain.write(stream)
def write(self, stream, resource=None): s = StreamWriter(stream) s.u32(self.version_major) s.u32(self.version_minor) s.i32(len(self.bones)) for bone in self.bones: for i in range(3): s.f32(bone.position[i]) for i in range(4): s.f32(bone.orientation[i]) for i in range(3): s.f32(bone.scale[i]) assert bone.name != None, "Bone %s must have a name" s.p32(bone.name) s.i32(-1 if not bone.opposite in self.bones else self.bones. index(bone.opposite)) s.i32(-1 if not bone.parent in self.bones else self.bones. index(bone.parent)) s.u32(FNV32.hash(bone.name)) s.u32(bone.flags) if self.version_major >= 4: s.p32(self.name) s.i32(len(self.ik_chains)) for chain in self.ik_chains: chain.write(stream)
def write(self, stream, resources=None): s = StreamWriter(stream) for val in self.min: s.f32(val) for val in self.max: s.f32(val)
def write(self, stream, resources=None): s = StreamWriter(stream) s.f32(self.weight) s.i32(len(self.decision_graph_nodes)) for dgn in self.decision_graph_nodes: s.u32(resources.get_block_index(dgn))
def write(self, stream, resource=None): Event.write(self, stream) s = StreamWriter(stream) s.f32(self.visibility)
def write(self, stream, tgi): s = StreamWriter(stream) s.u32(self.age_gender_flags) s.f32(self.amount) s.u32(tgi.get_resource_index(self.geom))
def write(self, stream, resource=None): Light.write(self, stream) s = StreamWriter(stream) for i in range(3): s.f32(self.at[i]) for i in range(3): s.f32(self.right[i]) s.f32(self.width) s.f32(self.height) s.f32(self.falloff_angle) s.f32(self.window_top_bottom_angle)