예제 #1
0
 def parse_chunk_materials(self, chunk):
     parser = BinaryReader(chunk)
     materials = []
     num_materials = parser.read_unsigned_int32()
     for i in range(num_materials):
         num_chars = parser.read_unsigned_int32()
         material = parser.read_string(num_chars)
         materials.append(material)
     return materials
예제 #2
0
 def parse_chunk_edges(self, chunk):
     parser = BinaryReader(chunk)
     edges = []
     num_edges = parser.read_unsigned_int32()
     for i in range(num_edges):
         vi_1 = parser.read_unsigned_int32()
         vi_2 = parser.read_unsigned_int32()
         smooth = bool(parser.read_unsigned_char8())
         edges.append({
             "vi_1": vi_1,
             "vi_2": vi_2,
             "smooth": smooth
         })
     return edges
예제 #3
0
 def parse_chunk_vertices(self, chunk):
     parser = BinaryReader(chunk)
     vertices = []
     num_vertices = parser.read_unsigned_int32()
     for i in range(num_vertices):
         vec3 = parser.read_vec3_float32()
         has_smoothing = bool(parser.read_unsigned_char8())
         vertices.append({
             "x": vec3[0],
             "y": vec3[1],
             "z": vec3[2],
             "has_smoothing": has_smoothing
         })
     return vertices
예제 #4
0
 def parse_chunk_faces(self, chunk):
     parser = BinaryReader(chunk)
     faces = []
     num_faces = parser.read_unsigned_int32()
     for i in range(num_faces):
         face = {}
         face["angle"] = parser.read_float32()
         face["offset"] = parser.read_vec2_float32()
         face["scale"] = parser.read_vec2_float32()
         face["mapping_group_id"] = parser.read_unsigned_int32()
         face["materialid"] = parser.read_unsigned_int32()
         face["edgeloops"] = []
         num_additional_edgeloops = parser.read_unsigned_int32()
         # border edge loop is always the first edge loop
         face["border_edgeloop"] = self.parse_edgeloop(parser)
         for j in range(num_additional_edgeloops):
             edgeloop = self.parse_edgeloop(parser)
             face["edgeloops"].append(edgeloop)
         faces.append(face)
     return faces
예제 #5
0
 def parse_chunk_mappinggroups(self, chunk):
     parser = BinaryReader(chunk)
     mappinggroups = {}
     num_mappinggroups = parser.read_unsigned_int32()
     for i in range(num_mappinggroups):
         mgid = parser.read_unsigned_int32()
         angle = parser.read_float32()
         scale = parser.read_vec2_float32()
         offset = parser.read_vec2_float32()
         normal = parser.read_vec3_float32()
         mappinggroups[mgid] = {
             "angle": angle,
             "scale": scale,
             "offset": offset,
             "normal": normal
         }
     return mappinggroups
예제 #6
0
 def parse_chunk_facelayers(self, chunk):
     parser = BinaryReader(chunk)
     facelayers = []
     num_facelayers = parser.read_unsigned_int32()
     format = parser.read_unsigned_int32()
     if format != 2:
         raise errors.ParseError("Error: format is not 2")
     for i in range(num_facelayers):
         facelayers.append([])
         has_layers = parser.read_unsigned_int32()
         has_layers = bool(has_layers)
         if has_layers:
             num_layerbitvalues = parser.read_unsigned_int32()
             for j in range(num_layerbitvalues):
                 bitmask = parser.read_unsigned_int32()
                 facelayers[i].append(bitmask)
     return facelayers
예제 #7
0
 def parse_chunk_geometrygroups(self, chunk):
     parser = BinaryReader(chunk)
     vertexgroups = {}
     num_vertexgroups = parser.read_unsigned_int32()
     for i in range(num_vertexgroups):
         vgid = parser.read_unsigned_int32()
         vertexgroups[vgid] = []
         num_indices = parser.read_unsigned_int32()
         for j in range(num_indices):
             index = parser.read_unsigned_int32()
             vertexgroups[vgid].append(index)
     edgegroups = {}
     num_edgegroups = parser.read_unsigned_int32()
     for i in range(num_edgegroups):
         egid = parser.read_unsigned_int32()
         edgegroups[egid] = []
         num_indices = parser.read_unsigned_int32()
         for j in range(num_indices):
             index = parser.read_unsigned_int32()
             edgegroups[egid].append(index)
     facegroups = {}
     num_facegroups = parser.read_unsigned_int32()
     for i in range(num_facegroups):
         fgid = parser.read_unsigned_int32()
         facegroups[fgid] = []
         num_indices = parser.read_unsigned_int32()
         for j in range(num_indices):
             index = parser.read_unsigned_int32()
             facegroups[fgid].append(index)
     groups = {
         "vertexgroups": vertexgroups,
         "edgegroups": edgegroups,
         "facegroups": facegroups
     }
     return groups
예제 #8
0
 def parse_chunk_triangles(self, chunk):
     parser = BinaryReader(chunk)
     ghost_vertices = []
     num_ghost_vertices = parser.read_unsigned_int32()
     for i in range(num_ghost_vertices):
         ghost_vertex = parser.read_vec3_float32()
         ghost_vertices.append(ghost_vertex)
     smoothed_normals = []
     num_smoothed_normals = parser.read_unsigned_int32()
     for i in range(num_smoothed_normals):
         smoothed_normal = parser.read_vec3_float32()
         smoothed_normals.append(smoothed_normal)
     num_faces = parser.read_unsigned_int32()
     num_triangles = parser.read_unsigned_int32()
     triangles = {"total": num_triangles, "faces": []}
     for i in range(num_faces):
         triangles["faces"].append([])
         num_face_triangles = parser.read_unsigned_int32()
         for j in range(num_face_triangles):
             vertex_index1 = parser.read_unsigned_int32()
             vertex_index2 = parser.read_unsigned_int32()
             vertex_index3 = parser.read_unsigned_int32()
             smoothed_normal_index1 = parser.read_unsigned_int32()
             smoothed_normal_index2 = parser.read_unsigned_int32()
             smoothed_normal_index3 = parser.read_unsigned_int32()
             triangles["faces"][i].append({
                 "vi_1": vertex_index1,
                 "vi_2": vertex_index2,
                 "vi_3": vertex_index3,
                 "sni_1": smoothed_normal_index1,
                 "sni_2": smoothed_normal_index2,
                 "sni_3": smoothed_normal_index3
             })
     return (ghost_vertices, smoothed_normals, triangles)