def compile(clazz, max_path, hv_dir, search_paths=None, verbose=False): tick = time.time() max_graph = MaxParser.graph_from_file(max_path) if not os.path.exists(hv_dir): os.makedirs(hv_dir) hv_file = os.path.basename(max_path).split(".")[0] + ".hv.json" hv_path = os.path.join(hv_dir, hv_file) with open(hv_path, "w") as f: if verbose: f.write( json.dumps(max_graph.to_hv(), sort_keys=True, indent=2, separators=(",", ": "))) else: f.write(json.dumps(max_graph.to_hv())) return { "stage": "max2hv", "notifs": { "has_error": False, "exception": None, "errors": [] }, "in_dir": os.path.dirname(max_path), "in_file": os.path.basename(max_path), "out_dir": hv_dir, "out_file": hv_file, "compile_time": (time.time() - tick) }
def __init__(self, modelMng, matMng, texMng): self.parser = MaxParser() self.modelMng = modelMng self.materialMng = matMng self.textureMng = texMng
class ModelLoader: def __init__(self, modelMng, matMng, texMng): self.parser = MaxParser() self.modelMng = modelMng self.materialMng = matMng self.textureMng = texMng def loadModel(self, filename): if not self.parser.parseFile(filename): return False self.modelName = filename self.saveMaterials() self.saveModel() return True def saveModel(self): self.model = Model([], [1, 0, 0, 0] + [0, 1, 0, 0] + [0, 0, 1, 0] + [0, 0, 0, 1], self.modelName) for m in self.parser.object.meshes: if m.type != 1: continue mesh = Mesh([], None, None, 16*[0]) # get system coordinates for i in range(0, 3): for j in range(0, 4): mesh.matrix4[i*3+j] = m.data.matrix[i+j*3] # get vertices & texCoordinates for i in range(0, m.data.nrOfVertices): mesh.vertices += m.data.vertices[i] if m.data.coordinates: if not mesh.texels: mesh.texels = [] mesh.texels += m.data.coordinates[i] # get faces if m.data.faces: mesh.triangles = [] for group in m.data.faces.materialGroups: triangles = Mesh.Triangles([], self.materialMng.get(group.materialName)) for i in group.faces: triangles.faces += m.data.faces.faces[i] mesh.triangles.append(triangles) self.model.meshes.append(mesh) self.modelMng.add(self.model) def saveMaterials(self): for m in self.parser.object.materials: self.saveTextures(m) material = Material(m.name) if m.textureMap1: material.texture = self.textureMng.get(m.textureMap1.name) self.materialMng.add(material) def saveTextures(self, material): for tex in material.textures: texture = Texture(tex.name) self.textureMng.add(texture) def getModel(self): return self.model
class ModelLoader: def __init__(self, modelMng, matMng, texMng): self.parser = MaxParser() self.modelMng = modelMng self.materialMng = matMng self.textureMng = texMng self.currentDir = "./" def loadModel(self, filename): if not self.parser.parseFile(filename): return False index = filename.rfind("/") if index > -1: self.currentDir = filename[0 : index + 1] self.modelName = filename self.saveMaterials() self.saveModel() return True def saveModel(self): self.model = Model([], self.modelName) for m in self.parser.object.meshes: if m.type != 1: continue geom = Mesh.Geometry([], [], []) # get vertices & texCoordinates triangles = [] geom.vertices = m.data.vertices if m.data.coordinates: geom.texCoords = m.data.coordinates # get faces if m.data.faces: geom.faces = m.data.faces.faces for group in m.data.faces.materialGroups: faces = [] for i in group.faces: faces.extend(m.data.faces.faces[i]) triangles.append(Mesh.Triangles(faces, self.materialMng.get(group.materialName))) # get mesh coordinates mat = m.data.matrix rot = 9 * [0] for i in range(3): for j in range(3): rot[3 * i + j] = mat[3 * j + i] mesh = Mesh(geom, triangles, Coordinate(rot, mat[9:])) mesh.name = m.name mesh.init() self.model.meshes.append(mesh) self.modelMng.add(self.model) def saveMaterials(self): for m in self.parser.object.materials: self.saveTextures(m) material = Material(m.name) material.ambient = m.ambientColor + [0] material.diffuse = m.diffuseColor + [0] material.specular = m.specularColor + [0] if m.textureMap1: material.texture = self.textureMng.get(m.textureMap1.name) if m.bumpMap: material.bump = self.textureMng.get(m.bumpMap.name) material.init() self.materialMng.add(material) def saveTextures(self, material): _dir = self.currentDir for tex in material.textures: image = self.textureMng.loadImage(tex.name, _dir + tex.name) texture = self.textureMng.loadTexture(tex.name, Texture.TEXTURE_2D) def getModel(self): return self.model