def write_mdl(self, stream: TokenStream, version=None): stream.start_object_block('ParticleEmitterPopcorn', self.name) self.write_generic_header(stream) if self.flags == 0x10000: stream.write_flag('SortPrimsFarZ') if self.flags == 0x8000: stream.write_flag('Unshaded') if self.flags == 0x40000: stream.write_flag('Unfogged') if not self.write_animation(stream, 'KPPL'): stream.write_number_attrib('static LifeSpan', self.life_span) if not self.write_animation(stream, 'KPPE'): stream.write_number_attrib('static EmissionRate', self.emission_rate) if not self.write_animation(stream, 'KPPS'): stream.write_number_attrib('static Speed', self.speed) if not self.write_animation(stream, 'KPPC'): stream.write_vector_attrib('static Color', self.color) if not self.write_animation(stream, 'KPPA'): stream.write_number_attrib('static Alpha', self.alpha) self.write_animation(stream, 'KPPV') if self.replaceable_id != 0: stream.write_number_attrib('ReplaceableId', self.replaceable_id) if len(self.path): stream.write_string_attrib('Path', self.path) if len(self.animation_visibility_guide): stream.write_string_attrib('AnimVisibilityGuide', self.animation_visibility_guide) self.write_generic_animations(stream) stream.end_block()
def write_mdl(self, stream: TokenStream, version=None): stream.start_object_block('ParticleEmitter', self.name) self.write_generic_header(stream) if self.flags == 0x8000: stream.write_flag('EmitterUsesMDL') if self.flags == 0x10000: stream.write_flag('EmitterUsesTGA') if not self.write_animation(stream, 'KPEE'): stream.write_number_attrib('static EmissionRate', self.emission_rate) if not self.write_animation(stream, 'KPEG'): stream.write_number_attrib('static Gravity', self.gravity) if not self.write_animation(stream, 'KPLN'): stream.write_number_attrib('static Longitude', self.longitude) if not self.write_animation(stream, 'KPLT'): stream.write_number_attrib('static Latitude', self.latitude) self.write_animation(stream, 'KPEV') stream.start_block('Particle', None) if not self.write_animation(stream, 'KPEL'): stream.write_number_attrib('static LifeSpan', self.life_span) if not self.write_animation(stream, 'KPES'): stream.write_number_attrib('static InitVelocity', self.speed) if (self.flags == 0x8000) or (self.flags == 0x10000): stream.write_string_attrib('Path', self.path) stream.end_block() self.write_generic_animations(stream) stream.end_block()
def write_mdl(self, stream: TokenStream, version=None): stream.start_object_block('Attachment', self.name) self.write_generic_header(stream) stream.write_number_attrib('AttachmentID', self.attachment_id) if len(self.path): stream.write_string_attrib('Path', self.path) self.write_animation(stream, 'KATV') self.write_generic_animations(stream) stream.end_block()
def write_mdl(self, stream: TokenStream, version=None): stream.start_block('Bitmap', None) if len(self.path): stream.write_string_attrib('Image', self.path) if self.replaceable_id != 0: stream.write_number_attrib('ReplaceableId', self.replaceable_id) if self.flags & 0x1: stream.write_flag('WrapWidth') if self.flags & 0x2: stream.write_flag('WrapHeight') stream.end_block()
def write_mdl(self, stream: TokenStream, version=None): stream.start_block('Geoset', None) stream.write_vector_array_block('Vertices', self.vertices, 3) stream.write_vector_array_block('Normals', self.normals, 3) for uv_set in self.uv_sets: stream.write_vector_array_block('TVertices', uv_set, 2) if version > 800 or len(self.tangents): stream.write_vector_array_block('Tangents', self.tangents, 4) if version > 800 or len(self.skin): stream.start_block('SkinWeights', len(self.skin) // 8) for i in range(0, len(self.skin), 8): stream.write_line( f'{", ".join([str(a) for a in self.skin[i:i + 8]])+","}') else: stream.start_block('VertexGroup', None) for i in range(len(self.vertex_groups)): stream.write_line(f'{self.vertex_groups[i]},') stream.end_block() stream.start_block('Faces', [str(1), str(len(self.faces))]) stream.start_block('Triangles', None) stream.write_vector(self.faces) stream.end_block() stream.end_block() stream.start_block( 'Groups', [str(len(self.matrix_groups)), str(len(self.matrix_indices))]) index = 0 for group_size in self.matrix_groups: stream.write_vector_attrib( 'Matrices', self.matrix_indices[index:index + group_size]) index += group_size stream.end_block() self.extent.write_mdl(stream) for sequence_extent in self.sequence_extents: stream.start_block('Anim', None) sequence_extent.write_mdl(stream) stream.end_block() stream.write_number_attrib('MaterialID', self.material_id) stream.write_number_attrib('SelectionGroup', self.selection_group) if self.selection_flags == 4: stream.write_flag('Unselectable') if version > 800: stream.write_number_attrib('LevelOfDetail', self.lod) if len(self.lod_name): stream.write_string_attrib('Name', self.lod_name) stream.end_block()
def write_mdl(self, stream: TokenStream, version=None): stream.start_block('Material', None) if self.flags & 0x1: stream.write_flag('ConstantColor') if version > 800: if self.flags & 0x2: stream.write_flag('TwoSided') if self.flags & 0x8: stream.write_flag('SortPrimsNearZ') if self.flags & 0x10: stream.write_flag('SortPrimsFarZ') if self.flags & 0x20: stream.write_flag('FullResolution') if self.priority_plane != 0: stream.write_number_attrib('PriorityPlane', self.priority_plane) if version > 800: stream.write_string_attrib('Shader', self.shader) for layer in self.layers: layer.write_mdl(stream, version=version) stream.end_block()
def save_model_block(self, stream: TokenStream): stream.start_object_block('Model', self.name) self.mdl_num_of_chunk = [ len(self.geosets), len(self.geoset_animations), len(self.helpers), len(self.lights), len(self.bones), len(self.attachments), len(self.particle_emitters), len(self.particle_emitters2), len(self.particle_emitters_popcorn), len(self.ribbon_emitters), len(self.event_objects), len(self.face_effects) ] stream.write_number_attrib('NumGeosets', self.mdl_num_of_chunk[0]) stream.write_number_attrib('NumGeosetAnims', self.mdl_num_of_chunk[1]) stream.write_number_attrib('NumHelpers', self.mdl_num_of_chunk[2]) stream.write_number_attrib('NumLights', self.mdl_num_of_chunk[3]) stream.write_number_attrib('NumBones', self.mdl_num_of_chunk[4]) stream.write_number_attrib('NumAttachments', self.mdl_num_of_chunk[5]) stream.write_number_attrib('NumParticleEmitters', self.mdl_num_of_chunk[6]) stream.write_number_attrib('NumParticleEmitters2', self.mdl_num_of_chunk[7]) if self.version > 800: stream.write_number_attrib('NumParticleEmittersPopcorn', self.mdl_num_of_chunk[8]) stream.write_number_attrib('NumRibbonEmitters', self.mdl_num_of_chunk[9]) stream.write_number_attrib('NumEvents', self.mdl_num_of_chunk[10]) if self.version > 800: stream.write_number_attrib('NumFaceFX', self.mdl_num_of_chunk[11]) stream.write_number_attrib('BlendTime', self.blend_time) self.extent.write_mdl(stream) if len(self.animation_file): stream.write_string_attrib('AnimationFile', self.animation_file) stream.end_block()
def write_mdl(self, stream: TokenStream, version=None): stream.start_object_block('FaceFX', self.type) stream.write_string_attrib('Path', self.path) stream.end_block()