示例#1
0
文件: mesh.py 项目: GitExl/DoomPath
    def create(self, nav_grid, map_data, config, max_area_size, max_area_size_merged):
        """
        Creates navigation areas from a navigation grid.
        """
        
        self.map_data = map_data
        self.config = config
        self.nav_grid = nav_grid
        self.max_area_size = max_area_size
        self.max_area_size_merged = max_area_size_merged
        self.max_size_elements = self.max_area_size / self.nav_grid.element_size
        
        # Determine the area where to test for elements.
        grid_area = Rectangle()
        grid_area.left = self.nav_grid.map_data.min.x / self.nav_grid.element_size
        grid_area.top = self.nav_grid.map_data.min.y / self.nav_grid.element_size
        grid_area.right = grid_area.left + self.nav_grid.size.x
        grid_area.bottom = grid_area.top + self.nav_grid.size.y
        
        # Generate square areas of decreasing size. 
        min_side = self.max_size_elements
        while min_side > 0:
            print 'Size iteration {}...'.format(min_side)
            self.generate_iteration(grid_area, min_side)            
            min_side -= 1
        
        # Merge areas until none can be merged any more.
        print 'Merging...'
        while 1:
            old_len = len(self.areas)
            self.areas = filter(self.area_merge_filter, self.areas)
            new_len = len(self.areas)
            
            # If no areas were removed, stop merging.
            if new_len == old_len:
                break
            
            print 'Merged to {} navigation areas.'.format(new_len)
        
        print 'Adding areas to blockmap...'
        self.map_data.blockmap.generate_areas(self)

        print 'Pruning elements...'
        self.prune_elements()
        
        print 'Connecting areas...'
        count = self.connect_areas()
        print 'Generated {} connections.'.format(count)
        
        print 'Connecting teleporters...'
        self.connect_teleporters()
        
        return True