directional = base.render.attach_new_node(directional) base.render.set_light(directional) for filename, tile_list in tile_lists.items(): cols = 8 rows = max(tile.tile_id for tile in tile_list.values()) // cols + 1 win = base.openWindow(type='offscreen', size=(cols * width, rows * height), makeCamera=True) level = base.render.attachNewNode("level") for tile in tile_list.values(): placeholder = level.attachNewNode("tile-placeholder") col = tile.tile_id % cols row = tile.tile_id // cols placeholder.setPos((cols - col - 1) + 0.5, 0, -((row + 1.0) * aspect - 0.5) * 2**0.5 - 0.1) tile.node.instanceTo(placeholder) if isinstance(tile, Train): train_node = tile.train.instanceTo(placeholder) lens.setFilmSize(cols, rows * aspect) base.camNode.setLens(lens) base.camera.set_pos(cols / 2, 8, -rows * 2**0.5 * aspect / 2 + 8) base.camera.look_at(cols / 2, 0, -rows * 2**0.5 * aspect / 2) base.graphicsEngine.renderFrame() base.screenshot(namePrefix=Path('data') / filename, defaultFilename=False) level.removeNode() base.closeWindow(win)