Пример #1
0
class Map(object):
    def __init__(self):
        self.gns = GNS()
        self.situation = None
        self.texture_files = None
        self.resource_files = None
        self.texture = Texture_File()
        self.resources = Resources()
        self.extents = None
        self.hypotenuse = None

    def set_situation(self, situation):
        self.situation = situation % len(self.gns.situations)
        self.texture_files = self.gns.get_texture_files(self.situation)
        self.resource_files = self.gns.get_resource_files(self.situation)
        self.texture = Texture_File()
        self.resources = Resources()

    def read(self):
        self.texture.read(self.texture_files)
        self.resources.read(self.resource_files)

    def write(self):
        #self.texture.write()
        self.resources.write()

    def get_texture(self):
        texture = Texture()
        texture.from_data(self.texture.data)
        return texture

    def get_polygons(self):
        minx = 32767
        miny = 32767
        minz = 32767
        maxx = -32768
        maxy = -32768
        maxz = -32768
        polygons = (list(self.get_tex_3gon()) + list(self.get_tex_4gon()) +
                    list(self.get_untex_3gon()) + list(self.get_untex_4gon()))
        for polygon in polygons:
            for vertex in polygon.vertices():
                minx = min(minx, vertex.point.X)
                miny = min(miny, vertex.point.Y)
                minz = min(minz, vertex.point.Z)
                maxx = max(maxx, vertex.point.X)
                maxy = max(maxy, vertex.point.Y)
                maxz = max(maxz, vertex.point.Z)
            yield polygon
        self.extents = ((minx, miny, minz), (maxx, maxy, maxz))
        self.get_hypotenuse()

    def get_hypotenuse(self):
        from math import sqrt
        size_x = abs(self.extents[1][0] - self.extents[0][0])
        size_y = abs(self.extents[1][1] - self.extents[0][1])
        size_z = abs(self.extents[1][2] - self.extents[0][2])
        self.hypotenuse = sqrt(size_x**2 + size_z**2)

    def get_tex_3gon(self, toc_index=0x40):
        points = self.resources.get_tex_3gon_xyz(toc_index)
        if toc_index == 0x40:
            visangles = self.resources.get_tex_3gon_vis()
        else:
            visangles = ['\x00\x00'] * 512
        normals = self.resources.get_tex_3gon_norm(toc_index)
        texcoords = self.resources.get_tex_3gon_uv(toc_index)
        terrain_coords = self.resources.get_tex_3gon_terrain_coords(toc_index)
        for point, visangle, normal, texcoord, terrain_coord in zip(
                points, visangles, normals, texcoords, terrain_coords):
            polygon = Triangle()
            polygon.from_data(point,
                              visangle,
                              normal,
                              texcoord,
                              terrain_coords=terrain_coord)
            yield polygon

    def get_tex_4gon(self, toc_index=0x40):
        points = self.resources.get_tex_4gon_xyz(toc_index)
        if toc_index == 0x40:
            visangles = self.resources.get_tex_4gon_vis()
        else:
            visangles = ['\x00\x00'] * 768
        normals = self.resources.get_tex_4gon_norm(toc_index)
        texcoords = self.resources.get_tex_4gon_uv(toc_index)
        terrain_coords = self.resources.get_tex_4gon_terrain_coords(toc_index)
        for point, visangle, normal, texcoord, terrain_coord in zip(
                points, visangles, normals, texcoords, terrain_coords):
            polygon = Quad()
            polygon.from_data(point,
                              visangle,
                              normal,
                              texcoord,
                              terrain_coords=terrain_coord)
            yield polygon

    def get_untex_3gon(self, toc_index=0x40):
        points = self.resources.get_untex_3gon_xyz(toc_index)
        if toc_index == 0x40:
            visangles = self.resources.get_untex_3gon_vis()
        else:
            visangles = ['\x00\x00'] * 64
        unknowns = self.resources.get_untex_3gon_unknown(toc_index)
        for point, visangle, unknown in zip(points, visangles, unknowns):
            polygon = Triangle()
            polygon.from_data(point, visangle, unknown5=unknown)
            yield polygon

    def get_untex_4gon(self, toc_index=0x40):
        points = self.resources.get_untex_4gon_xyz(toc_index)
        if toc_index == 0x40:
            visangles = self.resources.get_untex_4gon_vis()
        else:
            visangles = ['\x00\x00'] * 256
        unknowns = self.resources.get_untex_4gon_unknown(toc_index)
        for point, visangle, unknown in zip(points, visangles, unknowns):
            polygon = Quad()
            polygon.from_data(point, visangle, unknown5=unknown)
            yield polygon

    def get_color_palettes(self):
        palettes = self.resources.get_color_palettes()
        for palette_data in palettes:
            palette = Palette()
            palette.from_data(palette_data)
            yield palette

    def get_dir_lights(self):
        colors = self.resources.get_dir_light_rgb()
        normals = self.resources.get_dir_light_norm()
        for color, normal in zip(colors, normals):
            light = Directional_Light()
            light.from_data(color, normal)
            yield light

    def get_amb_light(self):
        color = self.resources.get_amb_light_rgb()
        light = Ambient_Light()
        light.from_data(color)
        return light

    def get_background(self):
        background_data = self.resources.get_background()
        background = Background()
        background.from_data(background_data)
        return background

    def get_terrain(self):
        terrain_data = self.resources.get_terrain()
        terrain = Terrain()
        terrain.from_data(terrain_data)
        return terrain

    def get_gray_palettes(self):
        palettes = self.resources.get_gray_palettes()
        for palette_data in palettes:
            palette = Palette()
            palette.from_data(palette_data)
            yield palette

    def put_texture(self, texture):
        tex = Texture()
        texture_data = tex.to_data(texture)
        self.texture.write(texture_data)

    def put_polygons(self, polygons):
        self.resources.put_polygons(polygons)

    def put_color_palettes(self, color_palettes):
        self.resources.put_palettes(color_palettes, 0x44)

    def put_dir_lights(self, dir_lights):
        self.resources.put_dir_lights(dir_lights)

    def put_amb_light(self, amb_light):
        light = Ambient_Light()
        light_data = light.to_data(amb_light)
        self.resources.put_amb_light_rgb(light_data)

    def put_background(self, background):
        bg = Background()
        bg_data = bg.to_data(background)
        self.resources.put_background(bg_data)

    def put_terrain(self, terrain):
        terr = Terrain()
        terrain_data = terr.to_data(terrain)
        self.resources.put_terrain(terrain_data)

    def put_visible_angles(self, polygons):
        self.resources.put_visible_angles(polygons)