Example #1
0
 def write_mdl(self, stream: TokenStream, name, version=None):
     interpolation_type = self.interpolation_type
     frames = self.frames
     values = self.values
     in_tans = self.in_tans
     out_tans = self.out_tans
     tracks_count = len(frames)
     stream.start_block(name, len(self.frames))
     token = ''
     if self.interpolation_type == 0:
         token = 'DontInterp'
     elif self.interpolation_type == 1:
         token = 'Linear'
     elif self.interpolation_type == 2:
         token = 'Hermite'
     elif self.interpolation_type == 3:
         token = 'Bezier'
     stream.write_flag(token)
     if self.global_sequence_id != -1:
         stream.write_number_attrib('GlobalSeqId', self.global_sequence_id)
     for i in range(tracks_count):
         self.write_mdl_value(stream, f'{frames[i]}:', values[i])
         if interpolation_type > 1:
             stream.indent()
             self.write_mdl_value(stream, 'InTan', in_tans[i])
             self.write_mdl_value(stream, 'OutTan', out_tans[i])
             stream.unindent()
     stream.end_block()
 def write_mdl(self, stream: TokenStream, version=None):
     stream.start_object_block('CollisionShape', self.name)
     self.write_generic_header(stream)
     _type = ''
     vertices = 2
     bounds_radius = False
     if self.type == 0:
         _type = 'Box'
     elif self.type == 1:
         _type = 'Plane'
     elif self.type == 2:
         _type = 'Sphere'
         vertices = 1
         bounds_radius = True
     elif self.type == 3:
         _type = 'Cylinder'
         bounds_radius = True
     stream.write_flag(_type)
     stream.start_block('Vertices', vertices)
     stream.write_vector(self.vertices[0])
     if vertices == 2:
         stream.write_vector(self.vertices[1])
     stream.end_block()
     if bounds_radius:
         stream.write_number_attrib('BoundsRadius', self.bounds_radius)
     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()
Example #4
0
 def save_bind_pose_block(self, stream: TokenStream):
     if len(self.bind_pose):
         stream.start_block('BindPose', None)
         stream.start_block('Matrices', len(self.bind_pose))
         for matrix in self.bind_pose:
             stream.write_vector(matrix)
         stream.end_block()
         stream.end_block()
Example #5
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()
Example #6
0
 def write_mdl(self, stream: TokenStream, version=None):
     stream.start_object_block('EventObject', self.name)
     self.write_generic_header(stream)
     stream.start_block('EventTrack', len(self.tracks))
     if self.global_sequence_id != -1:
         stream.write_number_attrib('GlobalSeqId', self.global_sequence_id)
     for track in self.tracks:
         stream.write_flag(f'{track}')
     stream.end_block()
     self.write_generic_animations(stream)
     stream.end_block()
Example #7
0
 def write_mdl(self, stream: TokenStream, version=None):
     stream.start_block('GeosetAnim', None)
     if self.flags & 0x1:
         stream.write_flag('DropShadow')
     if not self.write_animation(stream, 'KGAO'):
         stream.write_number_attrib('static Alpha', self.alpha)
     if self.flags & 0x2:
         if not self.write_animation(stream, 'KGAC') and (
                 self.color[0] != 1 or self.color[1] != 1
                 or self.color[2] != 1):
             stream.write_color('static Color ', self.color)
     stream.write_number_attrib('GeosetId', self.geoset_id)
     stream.end_block()
Example #8
0
 def write_mdl(self, stream: TokenStream, version=None):
     stream.start_object_block('Camera', self.name)
     stream.write_vector_attrib('Position', self.position)
     self.write_animation(stream, 'KCTR')
     self.write_animation(stream, 'KCRL')
     stream.write_number_attrib('FieldOfView', self.field_of_view)
     stream.write_number_attrib('FarClip', self.far_clipping_plane)
     stream.write_number_attrib('NearClip', self.near_clipping_plane)
     stream.start_block('Target', None)
     stream.write_vector_attrib('Position', self.target_position)
     self.write_animation(stream, 'KTTR')
     stream.end_block()
     stream.end_block()
Example #9
0
 def write_mdl(self, stream: TokenStream, version=None):
     stream.start_block('Layer', None)  # headers ??
     stream.write_flag_attrib('FilterMode',
                              filter_mode_to_mdl(self.filter_mode))
     if self.flags & 0x1:
         stream.write_flag('Unshaded')
     if self.flags & 0x2:
         stream.write_flag('SphereEnvMap')
     if self.flags & 0x10:
         stream.write_flag('TwoSided')
     if self.flags & 0x20:
         stream.write_flag('Unfogged')
     if self.flags & 0x40:
         stream.write_flag('NoDepthTest')
     if self.flags & 0x80:
         stream.write_flag('NoDepthSet')
     if version > 800:
         if self.flags & 0x100:
             stream.write_flag('Unlit')
     if not self.write_animation(stream, 'KMTF'):
         stream.write_number_attrib('static TextureID', self.texture_id)
     if self.texture_animation_id != -1:
         stream.write_number_attrib('TVertexAnimId',
                                    self.texture_animation_id)
     if self.coord_id != 0:
         stream.write_number_attrib('CoordId', self.coord_id)
     if not self.write_animation(stream, 'KMTA') and self.alpha != 1:
         stream.write_number_attrib('static Alpha', self.alpha)
     if version > 800:
         if not self.write_animation(stream,
                                     'KMTE') and self.emissive_gain != 1:
             stream.write_number_attrib('static EmissiveGain',
                                        self.emissive_gain)
         if not self.write_animation(stream, 'KFC3') and (
                 self.fresnel_color[0] != 1 or self.fresnel_color[1] != 1
                 or self.fresnel_color[2] != 1):
             stream.write_vector_attrib('static FresnelColor',
                                        self.fresnel_color)
         if not self.write_animation(stream,
                                     'KFCA') and self.fresnel_opacity != 0:
             stream.write_number_attrib('static FresnelOpacity',
                                        self.fresnel_opacity)
         if not self.write_animation(
                 stream, 'KFTC') and self.fresnel_team_color != 0:
             stream.write_number_attrib('static FresnelTeamColor',
                                        self.fresnel_team_color)
     stream.end_block()
Example #10
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()
Example #11
0
 def save_version_block(self, stream: TokenStream):
     stream.start_block('Version', None)
     stream.write_number_attrib('FormatVersion', self.version)
     stream.end_block()
 def write_mdl(self, stream: TokenStream, version=None):
     stream.start_block('TVertexAnim', None)
     self.write_animation(stream, 'KTAT')
     self.write_animation(stream, 'KTAR')
     self.write_animation(stream, 'KTAS')
     stream.end_block()
Example #13
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()
Example #14
0
 def save_static_objects_block(self, stream: TokenStream, name, objects):
     if len(objects):
         stream.start_block(name, len(objects))
         for obj in objects:
             obj.write_mdl(stream, version=self.version)
         stream.end_block()
Example #15
0
 def save_global_sequence_block(self, stream: TokenStream):
     if len(self.global_sequences):
         stream.start_block('GlobalSequences', len(self.global_sequences))
         for global_sequence in self.global_sequences:
             stream.write_number_attrib('Duration', global_sequence)
         stream.end_block()
Example #16
0
 def save_pivot_point_block(self, stream: TokenStream):
     if len(self.pivot_points):
         stream.start_block('PivotPoints', len(self.pivot_points))
         for pivot_point in self.pivot_points:
             stream.write_vector(pivot_point)
         stream.end_block()
 def write_mdl(self, stream: TokenStream, version=None):
     stream.start_object_block('ParticleEmitter2', 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 == 0x20000:
         stream.write_flag('LineEmitter')
     if self.flags == 0x40000:
         stream.write_flag('Unfogged')
     if self.flags == 0x80000:
         stream.write_flag('ModelSpace')
     if self.flags == 0x100000:
         stream.write_flag('XYQuad')
     if not self.write_animation(stream, 'KP2S'):
         stream.write_number_attrib('static Speed', self.speed)
     if not self.write_animation(stream, 'KP2R'):
         stream.write_number_attrib('static Variation', self.variation)
     if not self.write_animation(stream, 'KP2L'):
         stream.write_number_attrib('static Latitude', self.latitude)
     if not self.write_animation(stream, 'KP2G'):
         stream.write_number_attrib('static Gravity', self.gravity)
     self.write_animation(stream, 'KP2V')
     if self.squirt:
         stream.write_flag('Squirt')
     stream.write_number_attrib('LifeSpan', self.life_span)
     if not self.write_animation(stream, 'KP2E'):
         stream.write_number_attrib('static EmissionRate',
                                    self.emission_rate)
     if not self.write_animation(stream, 'KP2N'):
         stream.write_number_attrib('static Width', self.width)
     if not self.write_animation(stream, 'KP2W'):
         stream.write_number_attrib('static Length', self.length)
     if self.filter_mode == 0:
         stream.write_flag('Blend')
     elif self.filter_mode == 1:
         stream.write_flag('Additive')
     elif self.filter_mode == 2:
         stream.write_flag('Modulate')
     elif self.filter_mode == 3:
         stream.write_flag('Modulate2x')
     elif self.filter_mode == 4:
         stream.write_flag('AlphaKey')
     stream.write_number_attrib('Rows', self.rows)
     stream.write_number_attrib('Columns', self.columns)
     if self.head_or_tail == 0:
         stream.write_flag('Head')
     elif self.head_or_tail == 1:
         stream.write_flag('Tail')
     elif self.head_or_tail == 2:
         stream.write_flag('Both')
     stream.write_number_attrib('TailLength', self.tail_length)
     stream.write_number_attrib('Time', self.time_middle)
     stream.start_block('SegmentColor', None)
     stream.write_color('Color', self.segment_colors[0])
     stream.write_color('Color', self.segment_colors[1])
     stream.write_color('Color', self.segment_colors[2])
     stream.end_block_comma()
     stream.write_vector_attrib('Alpha', self.segment_alphas)
     stream.write_vector_attrib('ParticleScaling', self.segment_scaling)
     stream.write_vector_attrib('LifeSpanUVAnim', self.head_intervals[0])
     stream.write_vector_attrib('DecayUVAnim', self.head_intervals[1])
     stream.write_vector_attrib('TailUVAnim', self.tail_intervals[0])
     stream.write_vector_attrib('TailDecayUVAnim', self.tail_intervals[1])
     stream.write_number_attrib('TextureID', self.texture_id)
     if self.replaceable_id != 0:
         stream.write_number_attrib('ReplaceableId', self.replaceable_id)
     if self.priority_plane != 0:
         stream.write_number_attrib('PriorityPlane', self.priority_plane)
     self.write_generic_animations(stream)
     stream.end_block()