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)