コード例 #1
0
 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()
コード例 #2
0
 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()
コード例 #3
0
 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()
コード例 #4
0
 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()
コード例 #5
0
 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()
コード例 #6
0
 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()
コード例 #7
0
 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()
コード例 #8
0
 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()