Exemplo n.º 1
0
class Model:
    def __init__(self, file):
        self.file = file
        self.verts = []
        self.faces = []
        self.uv = []
        self.normals = []
        self.__diffusemap = TGAImage()
        self.__load()


    def __load(self):
        f = open(self.file, "r")
        for line in f:
            split = line.split()
            if len(split) > 0:
                if split[0] == "v":
                    vector = Vector(float(split[1]), float(split[2]), float(split[3]))
                    self.verts.append(vector)
                elif split[0] == "f":
                    face = [Vector(), Vector(), Vector()]
                    for i in range(0, 3):
                        face[i].x = int(split[i + 1].split("/")[0]) - 1    # 1 - based format
                        face[i].y = int(split[i + 1].split("/")[1]) - 1
                        face[i].z = int(split[i + 1].split("/")[2]) - 1
                    self.faces.append(face)
                elif split[0] == "vt":
                     texture = Vector(float(split[1]), float(split[2]), float(split[3]))
                     self.uv.append(texture)
                elif split[0] == "vn":
                     norm = Vector(float(split[1]), float(split[2]), float(split[3]))
                     self.normals.append(norm)
        print "%s    verts = %s   faces = %s   normals = %s   uv = %s" \
              % (self.file, len(self.verts), len(self.faces), len(self.normals), len(self.uv))
        f.close()
        self.__diffusemap.read(self.file.split(".")[0] + "_diffuse.tga")
        # self.__diffusemap.flip_vertically()
        # self.__diffusemap.write("n***a.tga")

    def write(self, filename):
        f = open(filename, "w")
        for v in self.verts:
            f.write('v ' + str(v.x) + '  ' + str(v.y) + '  ' + str(v.z) + '\n')
        f.write('\n')
        f.write("verts = %s " % (len(self.verts)))
        f.write('\n')
        for ff in self.faces:
            f.write('f ' + str(ff.x) + '  ' + str(ff.y) + '  ' + str(ff.z) + '\n')
        f.write("faces = %s " % (len(self.faces)))
        f.write('\n')
        for vt in self.vtextures:
            f.write('vt ' + str(vt.x) + '  ' + str(vt.y) + '  ' + str(vt.z) + '\n')
        f.write("textures = %s " % (len(self.vtextures)))
        f.close()

    def get_uv(self, iface, nvert):
        face = self.faces[iface]
        idx = face[nvert].get(1)
        return Vector(int(round(self.uv[idx].x * self.__diffusemap.width)), int(round(self.uv[idx].y * self.__diffusemap.height)))

    def get_norm(self, iface, nvert):
        face = self.faces[iface]
        idx = face[nvert].get(2)
        return self.normals[idx]

    def get_vert(self, iface, nvert):
        face = self.faces[iface]
        idx = face[nvert].get(0)
        return self.verts[idx]

    def diffuse(self, vect):
        return self.__diffusemap.get(int(round(vect.x)), int(round(vect.y)))