miniworld-maze 1.1.0__tar.gz → 1.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of miniworld-maze might be problematic. Click here for more details.
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/PKG-INFO +25 -14
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/README.md +23 -9
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/examples/basic_usage.py +4 -3
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/examples/benchmark_rendering.py +8 -2
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/examples/generate_observations.py +10 -3
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/examples/live_control_opencv.py +118 -141
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/examples/observation_level_demo.py +7 -4
- miniworld_maze-1.3.0/examples/save_topdown_views.py +215 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/pyproject.toml +2 -31
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/__init__.py +17 -5
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/constants.py +55 -14
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/__init__.py +1 -1
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/base_env.py +3 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/unified_env.py +23 -19
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/environments/__init__.py +0 -2
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/environments/base_grid_rooms.py +90 -15
- miniworld_maze-1.3.0/src/miniworld_maze/environments/factory.py +42 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/environments/nine_rooms.py +5 -23
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/environments/spiral_nine_rooms.py +5 -23
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/environments/twenty_five_rooms.py +5 -38
- miniworld_maze-1.3.0/src/miniworld_maze/tools/__init__.py +3 -0
- miniworld_maze-1.3.0/src/miniworld_maze/utils.py +286 -0
- miniworld_maze-1.1.0/src/miniworld_maze/environments/factory.py +0 -105
- miniworld_maze-1.1.0/src/miniworld_maze/tools/__init__.py +0 -5
- miniworld_maze-1.1.0/src/miniworld_maze/tools/generate_observations.py +0 -199
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/LICENSE +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/examples/README.md +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/__init__.py +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/README.md +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/entities/__init__.py +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/entities/agent.py +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/entities/base_entity.py +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/entities/objects.py +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/entity_manager.py +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/envs/__init__.py +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/math.py +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/objmesh.py +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/occlusion_queries.py +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/opengl.py +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/params.py +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/random.py +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/rendering/__init__.py +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/rendering/drawing.py +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/rendering/framebuffer.py +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/rendering/texture.py +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/rendering_engine.py +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/room.py +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/texture_utils.py +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/airduct_grate_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/asphalt_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/beanpaste_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/beige_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/black_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/blueberry_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/brick_wall_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/cardboard_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/cardboard_2.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/cardboard_3.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/cardboard_4.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/ceiling_tile_noborder_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/ceiling_tiles_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/cinder_blocks_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/cobaltgreen_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/concrete_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/concrete_2.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/concrete_3.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/concrete_4.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/concrete_tiles_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/copperred_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/crimson_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/door_doom_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/door_doom_2.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/door_garage_red.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/door_garage_white.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/door_steel_brown.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/door_steel_grey.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/door_steel_red.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/drywall_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/floor_tiles_bw_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/floor_tiles_white.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/grass_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/grass_2.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/lava_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/lava_2.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/lemongrass_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/lightbeige_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/lightcobaltgreen_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/lightgray_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/lightnavyblue_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/lightskyblue_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/lime_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/logo_mila_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/magenta_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/marble_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/marble_2.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/metal_grill_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/metal_grill_2.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/morningglory_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/navyblue_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/oakbrown_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/orange_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/orchid_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/picket_fence_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/adelaide_hanscom1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/adelaide_hanscom1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/alessandro_allori1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/alessandro_allori1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/alessandro_allori2.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/alessandro_allori2.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/alexandre_cabanel1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/alexandre_cabanel1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/alexei_harlamov1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/alexei_harlamov1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/alexey_petrovich_antropov1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/alexey_petrovich_antropov1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/alice_pike_barney1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/alice_pike_barney1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/aman_theodor1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/aman_theodor1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/antonello_messina1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/antonello_messina1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/antonio_herrera_toro1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/antonio_herrera_toro1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/benjamin-constant1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/benjamin-constant1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/benoist_marie-guillemine1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/benoist_marie-guillemine1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/bouguereau_william-adolphe1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/bouguereau_william-adolphe1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/byron1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/byron1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/carl_fredric_breda1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/carl_fredric_breda1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/carl_fredric_breda2.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/carl_fredric_breda2.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/cramacj_lucas1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/cramacj_lucas1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/cranach_lucas2.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/cranach_lucas2.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/cristobal_rojas1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/cristobal_rojas1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/delacroix_eugene_ferdinand_victor1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/delacroix_eugene_ferdinand_victor1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/domenikos_theotokopoulos1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/domenikos_theotokopoulos1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/edmund_blair_leighton1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/edmund_blair_leighton1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/edmund_blair_leighton2.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/edmund_blair_leighton2.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/edwin_longsden_long1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/edwin_longsden_long1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/falero_luis_ricardo1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/falero_luis_ricardo1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/felix_bonfils1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/felix_bonfils1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/francesco_hayez1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/francesco_hayez1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/francisco_goya_lucientes1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/francisco_goya_lucientes1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/francisco_goya_lucientes2.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/francisco_goya_lucientes2.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/francisco_zurbaran1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/francisco_zurbaran1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/franz_von_defregger1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/franz_von_defregger1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/franz_von_defregger2.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/franz_von_defregger2.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/franz_von_defregger3.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/franz_von_defregger3.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/frederic_westin1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/frederic_westin1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/frederic_yates1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/frederic_yates1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/frederick_leighton1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/frederick_leighton1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/gaston_bussiere1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/gaston_bussiere1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/george_henry_hall1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/george_henry_hall1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/giovanni_battista_tiepolo1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/giovanni_battista_tiepolo1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/giovanni_bellini1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/giovanni_bellini1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/hans_holbein1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/hans_holbein1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/hayez_francesco1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/hayez_francesco1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/henryk_siemiradzki1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/henryk_siemiradzki1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/ilja_jefimowitsch_repin1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/ilja_jefimowitsch_repin1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/james_carrol_beckwith1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/james_carrol_beckwith1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-baptiste-camille_corot1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-baptiste-camille_corot1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-baptiste-camille_corot2.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-baptiste-camille_corot2.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome2.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome2.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome3.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome3.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome4.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome4.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/john_william_godward1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/john_william_godward1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/john_william_godward2.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/john_william_godward2.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/john_william_godward3.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/john_william_godward3.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/julije_klovic1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/julije_klovic1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/juriaen_streek1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/juriaen_streek1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/kiprenskij_orest_adamovic1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/kiprenskij_orest_adamovic1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/konstantin_makovsky1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/konstantin_makovsky1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/lefebvre_jules_joseph1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/lefebvre_jules_joseph1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/leon-francois_comerre1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/leon-francois_comerre1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/leopold_loffler1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/leopold_loffler1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/lewis_john_frederick1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/lewis_john_frederick1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/madrazo_garreta_raimundo1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/madrazo_garreta_raimundo1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/marie_bashkirtseff1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/marie_bashkirtseff1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/moritz_kellerhoven1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/moritz_kellerhoven1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/nathaniel_jocelyn1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/nathaniel_jocelyn1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/nikolai_alexandrowitsch_jaroschenko1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/nikolai_alexandrowitsch_jaroschenko1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/nils_johan_olsson_blommer1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/nils_johan_olsson_blommer1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/paolo_veronese1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/paolo_veronese1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/parmigianino1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/parmigianino1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/paul_cesar_helleu1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/paul_cesar_helleu1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/regnault_henri1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/regnault_henri1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/richard_bergh1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/richard_bergh1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/richard_bergh2.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/richard_bergh2.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/robert_dampier1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/robert_dampier1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/robert_lefevre1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/robert_lefevre1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/robert_leopold1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/robert_leopold1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/sichel_nathanael1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/sichel_nathanael1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/svetoslav_roerich1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/svetoslav_roerich1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/velazquez_diego1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/velazquez_diego1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/viktor_vasnetsov1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/viktor_vasnetsov1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/william-adolphe_bouguereau1.license +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/portraits/william-adolphe_bouguereau1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/realblueberry_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/redbean_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/rock_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/seablue_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/silver_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/skyblue_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/slime_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/stucco_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/sunnyyellow_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/turquoise_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/violet_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/water_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/water_2.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/water_3.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/white_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/wood_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/wood_2.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/textures/wood_planks_1.png +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/utils.py +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/miniworld_gymnasium/wrappers.py +0 -0
- {miniworld_maze-1.1.0 → miniworld_maze-1.3.0}/src/miniworld_maze/core/observation_types.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: miniworld-maze
|
|
3
|
-
Version: 1.
|
|
4
|
-
Summary: Multi-room maze environments from the DrStrategy paper
|
|
3
|
+
Version: 1.3.0
|
|
4
|
+
Summary: Multi-room maze environments from the DrStrategy paper. Provides NineRooms-v0, SpiralNineRooms-v0, and TwentyFiveRooms-v0 gymnasium environments.
|
|
5
5
|
Keywords: reinforcement-learning,environment,gymnasium,multi-room-maze,drstrategy,maze-navigation,partial-observability,3d-environments
|
|
6
6
|
Author: Tim Joseph
|
|
7
7
|
Author-email: Tim Joseph <tim@mctigger.com>
|
|
@@ -46,9 +46,6 @@ Requires-Dist: opencv-python>=4.5.0,<5.0.0
|
|
|
46
46
|
Requires-Dist: pillow>=8.0.0,<11.0.0
|
|
47
47
|
Requires-Dist: pyopengl>=3.1.0,<4.0.0
|
|
48
48
|
Requires-Dist: pyglet>=1.5.0,<2.0.0
|
|
49
|
-
Requires-Dist: black>=22.0,<25.0 ; extra == 'dev'
|
|
50
|
-
Requires-Dist: isort>=5.10,<6.0 ; extra == 'dev'
|
|
51
|
-
Requires-Dist: flake8>=4.0,<7.0 ; extra == 'dev'
|
|
52
49
|
Requires-Dist: ruff>=0.1.0,<1.0.0 ; extra == 'dev'
|
|
53
50
|
Requires-Dist: build>=0.8.0,<2.0.0 ; extra == 'dev'
|
|
54
51
|
Requires-Dist: twine>=4.0.0,<6.0.0 ; extra == 'dev'
|
|
@@ -83,6 +80,18 @@ pip install miniworld-maze
|
|
|
83
80
|
|
|
84
81
|
## Usage
|
|
85
82
|
|
|
83
|
+
### Registered Environments
|
|
84
|
+
|
|
85
|
+
This package registers the following gymnasium environments:
|
|
86
|
+
|
|
87
|
+
| Environment ID | Description | Rooms | Max Steps |
|
|
88
|
+
|---|---|---|---|
|
|
89
|
+
| `NineRooms-v0` | Standard 3×3 grid with adjacent room connections | 9 | 1000 |
|
|
90
|
+
| `SpiralNineRooms-v0` | 3×3 grid with spiral connection pattern | 9 | 1000 |
|
|
91
|
+
| `TwentyFiveRooms-v0` | Large 5×5 grid with complex navigation | 25 | 1000 |
|
|
92
|
+
|
|
93
|
+
All environments use `TOP_DOWN_PARTIAL` observation level and factory default room/door sizes by default.
|
|
94
|
+
|
|
86
95
|
### Basic Usage
|
|
87
96
|
|
|
88
97
|
See `examples/basic_usage.py` for a complete working example:
|
|
@@ -95,12 +104,13 @@ Basic usage example for miniworld-maze environments.
|
|
|
95
104
|
This is a minimal example showing how to create and interact with the environment.
|
|
96
105
|
"""
|
|
97
106
|
|
|
98
|
-
|
|
107
|
+
import gymnasium as gym
|
|
108
|
+
import miniworld_maze # noqa: F401
|
|
99
109
|
|
|
100
110
|
|
|
101
111
|
def main():
|
|
102
|
-
# Create environment
|
|
103
|
-
env =
|
|
112
|
+
# Create environment using gymnasium registry
|
|
113
|
+
env = gym.make("NineRooms-v0", obs_width=64, obs_height=64)
|
|
104
114
|
obs, info = env.reset()
|
|
105
115
|
|
|
106
116
|
# obs is a dictionary containing:
|
|
@@ -212,14 +222,15 @@ Each environment supports three different observation modes:
|
|
|
212
222
|
All environments can be customized with the following parameters:
|
|
213
223
|
|
|
214
224
|
```python
|
|
215
|
-
|
|
216
|
-
from miniworld_maze
|
|
225
|
+
import gymnasium as gym
|
|
226
|
+
from miniworld_maze import ObservationLevel
|
|
227
|
+
import miniworld_maze # noqa: F401
|
|
217
228
|
|
|
218
|
-
env =
|
|
219
|
-
|
|
229
|
+
env = gym.make(
|
|
230
|
+
"NineRooms-v0", # Environment variant
|
|
220
231
|
obs_level=ObservationLevel.TOP_DOWN_PARTIAL, # Observation type
|
|
221
|
-
|
|
222
|
-
|
|
232
|
+
obs_width=64, # Observation image width
|
|
233
|
+
obs_height=64, # Observation image height
|
|
223
234
|
room_size=5, # Size of each room in environment units
|
|
224
235
|
door_size=2, # Size of doors between rooms
|
|
225
236
|
agent_mode="empty", # Agent rendering: "empty", "circle", "triangle"
|
|
@@ -19,6 +19,18 @@ pip install miniworld-maze
|
|
|
19
19
|
|
|
20
20
|
## Usage
|
|
21
21
|
|
|
22
|
+
### Registered Environments
|
|
23
|
+
|
|
24
|
+
This package registers the following gymnasium environments:
|
|
25
|
+
|
|
26
|
+
| Environment ID | Description | Rooms | Max Steps |
|
|
27
|
+
|---|---|---|---|
|
|
28
|
+
| `NineRooms-v0` | Standard 3×3 grid with adjacent room connections | 9 | 1000 |
|
|
29
|
+
| `SpiralNineRooms-v0` | 3×3 grid with spiral connection pattern | 9 | 1000 |
|
|
30
|
+
| `TwentyFiveRooms-v0` | Large 5×5 grid with complex navigation | 25 | 1000 |
|
|
31
|
+
|
|
32
|
+
All environments use `TOP_DOWN_PARTIAL` observation level and factory default room/door sizes by default.
|
|
33
|
+
|
|
22
34
|
### Basic Usage
|
|
23
35
|
|
|
24
36
|
See `examples/basic_usage.py` for a complete working example:
|
|
@@ -31,12 +43,13 @@ Basic usage example for miniworld-maze environments.
|
|
|
31
43
|
This is a minimal example showing how to create and interact with the environment.
|
|
32
44
|
"""
|
|
33
45
|
|
|
34
|
-
|
|
46
|
+
import gymnasium as gym
|
|
47
|
+
import miniworld_maze # noqa: F401
|
|
35
48
|
|
|
36
49
|
|
|
37
50
|
def main():
|
|
38
|
-
# Create environment
|
|
39
|
-
env =
|
|
51
|
+
# Create environment using gymnasium registry
|
|
52
|
+
env = gym.make("NineRooms-v0", obs_width=64, obs_height=64)
|
|
40
53
|
obs, info = env.reset()
|
|
41
54
|
|
|
42
55
|
# obs is a dictionary containing:
|
|
@@ -148,14 +161,15 @@ Each environment supports three different observation modes:
|
|
|
148
161
|
All environments can be customized with the following parameters:
|
|
149
162
|
|
|
150
163
|
```python
|
|
151
|
-
|
|
152
|
-
from miniworld_maze
|
|
164
|
+
import gymnasium as gym
|
|
165
|
+
from miniworld_maze import ObservationLevel
|
|
166
|
+
import miniworld_maze # noqa: F401
|
|
153
167
|
|
|
154
|
-
env =
|
|
155
|
-
|
|
168
|
+
env = gym.make(
|
|
169
|
+
"NineRooms-v0", # Environment variant
|
|
156
170
|
obs_level=ObservationLevel.TOP_DOWN_PARTIAL, # Observation type
|
|
157
|
-
|
|
158
|
-
|
|
171
|
+
obs_width=64, # Observation image width
|
|
172
|
+
obs_height=64, # Observation image height
|
|
159
173
|
room_size=5, # Size of each room in environment units
|
|
160
174
|
door_size=2, # Size of doors between rooms
|
|
161
175
|
agent_mode="empty", # Agent rendering: "empty", "circle", "triangle"
|
|
@@ -5,12 +5,13 @@ Basic usage example for miniworld-maze environments.
|
|
|
5
5
|
This is a minimal example showing how to create and interact with the environment.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
import gymnasium as gym
|
|
9
|
+
import miniworld_maze # noqa: F401
|
|
9
10
|
|
|
10
11
|
|
|
11
12
|
def main():
|
|
12
|
-
# Create environment
|
|
13
|
-
env =
|
|
13
|
+
# Create environment using gymnasium registry
|
|
14
|
+
env = gym.make("NineRooms-v0", obs_width=64, obs_height=64)
|
|
14
15
|
obs, info = env.reset()
|
|
15
16
|
|
|
16
17
|
# obs is a dictionary containing:
|
|
@@ -23,7 +23,8 @@ from miniworld_maze.core.constants import (
|
|
|
23
23
|
MB_TO_BYTES,
|
|
24
24
|
RGB_CHANNELS,
|
|
25
25
|
)
|
|
26
|
-
|
|
26
|
+
import gymnasium as gym
|
|
27
|
+
import miniworld_maze # noqa: F401
|
|
27
28
|
|
|
28
29
|
|
|
29
30
|
def benchmark_rendering_performance(
|
|
@@ -58,7 +59,12 @@ def benchmark_rendering_performance(
|
|
|
58
59
|
print(f"\n🔍 Testing {size}x{size} observations...")
|
|
59
60
|
|
|
60
61
|
# Create environment with specific observation size
|
|
61
|
-
|
|
62
|
+
variant_mapping = {
|
|
63
|
+
"NineRooms": "NineRooms-v0",
|
|
64
|
+
"SpiralNineRooms": "SpiralNineRooms-v0",
|
|
65
|
+
"TwentyFiveRooms": "TwentyFiveRooms-v0"
|
|
66
|
+
}
|
|
67
|
+
env = gym.make(variant_mapping[variant], obs_width=size, obs_height=size)
|
|
62
68
|
|
|
63
69
|
# Warmup phase
|
|
64
70
|
print(f" 🔥 Warming up ({num_warmup} steps)...")
|
|
@@ -10,10 +10,12 @@ import os
|
|
|
10
10
|
import numpy as np
|
|
11
11
|
from PIL import Image
|
|
12
12
|
|
|
13
|
+
import gymnasium as gym
|
|
14
|
+
|
|
13
15
|
from miniworld_maze.core.miniworld_gymnasium.rendering.framebuffer import (
|
|
14
16
|
FrameBuffer,
|
|
15
17
|
)
|
|
16
|
-
|
|
18
|
+
import miniworld_maze # noqa: F401
|
|
17
19
|
|
|
18
20
|
|
|
19
21
|
def generate_observations(variant, output_dir=None, high_res_full_views=False):
|
|
@@ -24,7 +26,12 @@ def generate_observations(variant, output_dir=None, high_res_full_views=False):
|
|
|
24
26
|
os.makedirs(output_dir, exist_ok=True)
|
|
25
27
|
|
|
26
28
|
# Create environment
|
|
27
|
-
|
|
29
|
+
variant_mapping = {
|
|
30
|
+
"NineRooms": "NineRooms-v0",
|
|
31
|
+
"SpiralNineRooms": "SpiralNineRooms-v0",
|
|
32
|
+
"TwentyFiveRooms": "TwentyFiveRooms-v0"
|
|
33
|
+
}
|
|
34
|
+
env = gym.make(variant_mapping[variant], obs_width=64, obs_height=64)
|
|
28
35
|
|
|
29
36
|
# Get base environment for direct render access
|
|
30
37
|
base_env = env.env if hasattr(env, "env") else env
|
|
@@ -157,7 +164,7 @@ def generate_observations(variant, output_dir=None, high_res_full_views=False):
|
|
|
157
164
|
|
|
158
165
|
for i, (pos, pos_name) in enumerate(test_positions):
|
|
159
166
|
# First-person view from agent's perspective
|
|
160
|
-
render_obs =
|
|
167
|
+
render_obs = base_env.render_on_pos(pos)
|
|
161
168
|
|
|
162
169
|
# Convert CHW to HWC for PIL
|
|
163
170
|
if len(render_obs.shape) == 3 and render_obs.shape[0] == 3:
|
|
@@ -28,7 +28,15 @@ from typing import Optional
|
|
|
28
28
|
import cv2
|
|
29
29
|
import numpy as np
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
import gymnasium as gym
|
|
32
|
+
|
|
33
|
+
from miniworld_maze import ObservationLevel
|
|
34
|
+
import miniworld_maze # noqa: F401
|
|
35
|
+
from miniworld_maze.utils import (
|
|
36
|
+
clamp_pixel_coords,
|
|
37
|
+
environment_to_pixel_coords,
|
|
38
|
+
get_environment_bounds,
|
|
39
|
+
)
|
|
32
40
|
|
|
33
41
|
OPENCV_AVAILABLE = True
|
|
34
42
|
|
|
@@ -110,18 +118,25 @@ class OpenCVLiveController:
|
|
|
110
118
|
print(f"🔄 Creating {variant} environments...")
|
|
111
119
|
|
|
112
120
|
# Create main environment (ego view)
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
121
|
+
variant_mapping = {
|
|
122
|
+
"NineRooms": "NineRooms-v0",
|
|
123
|
+
"SpiralNineRooms": "SpiralNineRooms-v0",
|
|
124
|
+
"TwentyFiveRooms": "TwentyFiveRooms-v0"
|
|
125
|
+
}
|
|
126
|
+
self.env = gym.make(
|
|
127
|
+
variant_mapping[variant],
|
|
128
|
+
obs_width=self.size,
|
|
129
|
+
obs_height=self.size,
|
|
116
130
|
obs_level=self.obs_level,
|
|
117
131
|
agent_mode="triangle", # Make agent visible for better demo
|
|
118
132
|
info_obs=[ObservationLevel.FIRST_PERSON],
|
|
119
133
|
)
|
|
120
134
|
|
|
121
135
|
# Create separate environment for top-down map
|
|
122
|
-
self.map_env =
|
|
123
|
-
variant
|
|
124
|
-
|
|
136
|
+
self.map_env = gym.make(
|
|
137
|
+
variant_mapping[variant],
|
|
138
|
+
obs_width=self.size,
|
|
139
|
+
obs_height=self.size,
|
|
125
140
|
obs_level=ObservationLevel.TOP_DOWN_FULL,
|
|
126
141
|
# Always use full top-down for map
|
|
127
142
|
agent_mode="triangle", # Make agent visible in map view
|
|
@@ -130,7 +145,7 @@ class OpenCVLiveController:
|
|
|
130
145
|
|
|
131
146
|
# Synchronize both environments to same initial state
|
|
132
147
|
obs, info = self.env.reset(seed=42)
|
|
133
|
-
map_obs,
|
|
148
|
+
map_obs, _ = self.map_env.reset(seed=42)
|
|
134
149
|
|
|
135
150
|
# Store info for accessing additional observations
|
|
136
151
|
self.current_info = info
|
|
@@ -216,138 +231,100 @@ class OpenCVLiveController:
|
|
|
216
231
|
|
|
217
232
|
def get_map_view_display(self) -> Optional[np.ndarray]:
|
|
218
233
|
"""
|
|
219
|
-
Get current map observation with agent
|
|
234
|
+
Get current map observation with agent and goal markers.
|
|
220
235
|
|
|
221
236
|
Returns:
|
|
222
237
|
BGR image array for OpenCV or None if failed
|
|
223
238
|
"""
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
base_env = base_env.env
|
|
230
|
-
elif hasattr(base_env, "_env"):
|
|
231
|
-
base_env = base_env._env
|
|
232
|
-
else:
|
|
233
|
-
break
|
|
234
|
-
|
|
235
|
-
# Use the new get_observation method with agent rendering enabled
|
|
236
|
-
if hasattr(base_env, "get_observation"):
|
|
237
|
-
map_obs_with_agent = base_env.get_observation(render_agent=True)
|
|
238
|
-
|
|
239
|
-
if map_obs_with_agent is not None:
|
|
240
|
-
# get_observation returns HWC format, so use directly
|
|
241
|
-
obs_hwc = map_obs_with_agent
|
|
242
|
-
|
|
243
|
-
# Convert RGB to BGR for OpenCV
|
|
244
|
-
obs_bgr = cv2.cvtColor(obs_hwc, cv2.COLOR_RGB2BGR)
|
|
245
|
-
|
|
246
|
-
# Resize for display
|
|
247
|
-
obs_resized = cv2.resize(obs_bgr, (self.view_size, self.view_size))
|
|
248
|
-
|
|
249
|
-
return obs_resized
|
|
250
|
-
else:
|
|
251
|
-
return self._create_placeholder("No Map View")
|
|
252
|
-
else:
|
|
253
|
-
# Fallback to current observation with manual overlay (HWC format)
|
|
254
|
-
if self.current_map_obs is not None:
|
|
255
|
-
obs_hwc = self.current_map_obs # Already in HWC format
|
|
256
|
-
obs_bgr = cv2.cvtColor(obs_hwc, cv2.COLOR_RGB2BGR)
|
|
257
|
-
obs_resized = cv2.resize(obs_bgr, (self.view_size, self.view_size))
|
|
258
|
-
return self._add_agent_marker(obs_resized)
|
|
259
|
-
else:
|
|
260
|
-
return self._create_placeholder("No Map View")
|
|
261
|
-
else:
|
|
262
|
-
return self._create_placeholder("No Map View")
|
|
239
|
+
# Use current map observation with manual overlay
|
|
240
|
+
obs_hwc = self.current_map_obs # Already in HWC format
|
|
241
|
+
obs_bgr = cv2.cvtColor(obs_hwc, cv2.COLOR_RGB2BGR)
|
|
242
|
+
obs_resized = cv2.resize(obs_bgr, (self.view_size, self.view_size))
|
|
243
|
+
return self._add_agent_marker(obs_resized)
|
|
263
244
|
|
|
264
245
|
def _add_agent_marker(self, map_image: np.ndarray) -> np.ndarray:
|
|
265
246
|
"""
|
|
266
|
-
Add agent
|
|
247
|
+
Add agent and goal position markers to the map view.
|
|
267
248
|
|
|
268
249
|
Args:
|
|
269
250
|
map_image: The top-down map image
|
|
270
251
|
|
|
271
252
|
Returns:
|
|
272
|
-
Map image with agent
|
|
253
|
+
Map image with agent and goal markers
|
|
273
254
|
"""
|
|
274
|
-
# Get
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
if hasattr(base_env, "env"):
|
|
278
|
-
base_env = base_env.env
|
|
279
|
-
elif hasattr(base_env, "_env"):
|
|
280
|
-
base_env = base_env._env
|
|
281
|
-
else:
|
|
282
|
-
break
|
|
283
|
-
|
|
284
|
-
# Get agent position and orientation
|
|
285
|
-
if hasattr(base_env, "agent") and base_env.agent is not None:
|
|
286
|
-
agent_pos = base_env.agent.pos
|
|
287
|
-
agent_dir = base_env.agent.dir
|
|
288
|
-
|
|
289
|
-
# Convert world coordinates to pixel coordinates
|
|
290
|
-
# Environment bounds
|
|
291
|
-
env_min_x = base_env.min_x
|
|
292
|
-
env_max_x = base_env.max_x
|
|
293
|
-
env_min_z = base_env.min_z
|
|
294
|
-
env_max_z = base_env.max_z
|
|
295
|
-
|
|
296
|
-
# Convert agent position to pixel coordinates
|
|
297
|
-
pixel_x = int(
|
|
298
|
-
(agent_pos[0] - env_min_x) / (env_max_x - env_min_x) * self.view_size
|
|
299
|
-
)
|
|
300
|
-
pixel_z = int(
|
|
301
|
-
(agent_pos[2] - env_min_z) / (env_max_z - env_min_z) * self.view_size
|
|
302
|
-
)
|
|
255
|
+
# Get positions from info dictionary - these are guaranteed to be available
|
|
256
|
+
agent_pos_2d = self.current_info["agent_position"] # [x, z] coordinates as ndarray
|
|
257
|
+
goal_pos_2d = self.current_info["goal_position"] # [x, z] coordinates as ndarray
|
|
303
258
|
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
# Create a copy to avoid modifying the original
|
|
309
|
-
marked_image = map_image.copy()
|
|
310
|
-
|
|
311
|
-
# Draw agent position as a circle
|
|
312
|
-
agent_radius = max(5, self.view_size // 80) # Scale with image size
|
|
313
|
-
cv2.circle(
|
|
314
|
-
marked_image, (pixel_x, pixel_z), agent_radius, (0, 255, 255), -1
|
|
315
|
-
) # Yellow filled circle
|
|
316
|
-
cv2.circle(
|
|
317
|
-
marked_image, (pixel_x, pixel_z), agent_radius + 2, (0, 0, 0), 2
|
|
318
|
-
) # Black outline
|
|
319
|
-
|
|
320
|
-
# Draw direction indicator (small arrow/line)
|
|
321
|
-
if agent_dir is not None:
|
|
322
|
-
# Calculate direction vector
|
|
323
|
-
dir_length = agent_radius + 8
|
|
324
|
-
end_x = int(pixel_x + dir_length * math.cos(agent_dir))
|
|
325
|
-
end_z = int(pixel_z + dir_length * math.sin(agent_dir))
|
|
326
|
-
|
|
327
|
-
# Draw direction line
|
|
328
|
-
cv2.line(
|
|
329
|
-
marked_image, (pixel_x, pixel_z), (end_x, end_z), (0, 255, 0), 3
|
|
330
|
-
) # Green direction line
|
|
331
|
-
|
|
332
|
-
# Draw small arrowhead
|
|
333
|
-
arrow_size = 5
|
|
334
|
-
arrow_angle = 0.5 # radians
|
|
335
|
-
|
|
336
|
-
# Calculate arrowhead points
|
|
337
|
-
left_x = int(end_x - arrow_size * math.cos(agent_dir - arrow_angle))
|
|
338
|
-
left_z = int(end_z - arrow_size * math.sin(agent_dir - arrow_angle))
|
|
339
|
-
right_x = int(end_x - arrow_size * math.cos(agent_dir + arrow_angle))
|
|
340
|
-
right_z = int(end_z - arrow_size * math.sin(agent_dir + arrow_angle))
|
|
341
|
-
|
|
342
|
-
# Draw arrowhead
|
|
343
|
-
cv2.line(marked_image, (end_x, end_z), (left_x, left_z), (0, 255, 0), 2)
|
|
344
|
-
cv2.line(
|
|
345
|
-
marked_image, (end_x, end_z), (right_x, right_z), (0, 255, 0), 2
|
|
346
|
-
)
|
|
259
|
+
# Get environment bounds using utility function
|
|
260
|
+
env_min_bounds, env_max_bounds = get_environment_bounds(self.map_env)
|
|
261
|
+
env_min_bounds = np.array(env_min_bounds)
|
|
262
|
+
env_max_bounds = np.array(env_max_bounds)
|
|
347
263
|
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
264
|
+
# Create a copy to avoid modifying the original
|
|
265
|
+
marked_image = map_image.copy()
|
|
266
|
+
|
|
267
|
+
# Convert goal position to pixel coordinates and clamp
|
|
268
|
+
goal_pixel_x, goal_pixel_z = environment_to_pixel_coords(
|
|
269
|
+
goal_pos_2d, env_min_bounds, env_max_bounds, self.view_size
|
|
270
|
+
)
|
|
271
|
+
goal_pixel_x, goal_pixel_z = clamp_pixel_coords(
|
|
272
|
+
goal_pixel_x, goal_pixel_z, self.view_size
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
# Draw goal as a red circle
|
|
276
|
+
goal_radius = max(7, self.view_size // 70)
|
|
277
|
+
cv2.circle(
|
|
278
|
+
marked_image, (goal_pixel_x, goal_pixel_z), goal_radius, (0, 0, 255), -1
|
|
279
|
+
) # Red filled circle
|
|
280
|
+
cv2.circle(
|
|
281
|
+
marked_image,
|
|
282
|
+
(goal_pixel_x, goal_pixel_z),
|
|
283
|
+
goal_radius + 2,
|
|
284
|
+
(255, 255, 255),
|
|
285
|
+
2,
|
|
286
|
+
) # White outline
|
|
287
|
+
|
|
288
|
+
# Convert agent position to pixel coordinates and clamp
|
|
289
|
+
pixel_x, pixel_z = environment_to_pixel_coords(
|
|
290
|
+
agent_pos_2d, env_min_bounds, env_max_bounds, self.view_size
|
|
291
|
+
)
|
|
292
|
+
pixel_x, pixel_z = clamp_pixel_coords(pixel_x, pixel_z, self.view_size)
|
|
293
|
+
|
|
294
|
+
# Draw agent position as a circle
|
|
295
|
+
agent_radius = max(5, self.view_size // 80)
|
|
296
|
+
cv2.circle(
|
|
297
|
+
marked_image, (pixel_x, pixel_z), agent_radius, (0, 255, 255), -1
|
|
298
|
+
) # Yellow filled circle
|
|
299
|
+
cv2.circle(
|
|
300
|
+
marked_image, (pixel_x, pixel_z), agent_radius + 2, (0, 0, 0), 2
|
|
301
|
+
) # Black outline
|
|
302
|
+
|
|
303
|
+
# Draw direction indicator
|
|
304
|
+
# Get base environment for agent direction
|
|
305
|
+
base_env = self.map_env.unwrapped
|
|
306
|
+
agent_dir = base_env.agent.dir
|
|
307
|
+
dir_length = agent_radius + 8
|
|
308
|
+
end_x = int(pixel_x + dir_length * math.cos(agent_dir))
|
|
309
|
+
end_z = int(pixel_z + dir_length * math.sin(agent_dir))
|
|
310
|
+
|
|
311
|
+
# Draw direction line
|
|
312
|
+
cv2.line(
|
|
313
|
+
marked_image, (pixel_x, pixel_z), (end_x, end_z), (0, 255, 0), 3
|
|
314
|
+
) # Green direction line
|
|
315
|
+
|
|
316
|
+
# Draw arrowhead
|
|
317
|
+
arrow_size = 5
|
|
318
|
+
arrow_angle = 0.5 # radians
|
|
319
|
+
left_x = int(end_x - arrow_size * math.cos(agent_dir - arrow_angle))
|
|
320
|
+
left_z = int(end_z - arrow_size * math.sin(agent_dir - arrow_angle))
|
|
321
|
+
right_x = int(end_x - arrow_size * math.cos(agent_dir + arrow_angle))
|
|
322
|
+
right_z = int(end_z - arrow_size * math.sin(agent_dir + arrow_angle))
|
|
323
|
+
|
|
324
|
+
cv2.line(marked_image, (end_x, end_z), (left_x, left_z), (0, 255, 0), 2)
|
|
325
|
+
cv2.line(marked_image, (end_x, end_z), (right_x, right_z), (0, 255, 0), 2)
|
|
326
|
+
|
|
327
|
+
return marked_image
|
|
351
328
|
|
|
352
329
|
def _create_placeholder(self, text: str) -> np.ndarray:
|
|
353
330
|
"""Create a placeholder image with text."""
|
|
@@ -484,16 +461,18 @@ class OpenCVLiveController:
|
|
|
484
461
|
legend_y = goal_y + 20
|
|
485
462
|
legend_font_scale = 0.4
|
|
486
463
|
|
|
487
|
-
# Legend text -
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
464
|
+
# Legend text - positions from info dict
|
|
465
|
+
legend_lines = ["Yellow: Agent (from info)", "Red: Goal (from info)"]
|
|
466
|
+
for i, line in enumerate(legend_lines):
|
|
467
|
+
cv2.putText(
|
|
468
|
+
combined_img,
|
|
469
|
+
line,
|
|
470
|
+
(legend_x, legend_y + i * 15),
|
|
471
|
+
font,
|
|
472
|
+
legend_font_scale,
|
|
473
|
+
(200, 200, 200),
|
|
474
|
+
1,
|
|
475
|
+
)
|
|
497
476
|
|
|
498
477
|
# Create info panel at bottom
|
|
499
478
|
info_y = self.view_size + 70
|
|
@@ -560,7 +539,7 @@ class OpenCVLiveController:
|
|
|
560
539
|
# Use same seed to keep environments synchronized
|
|
561
540
|
seed = np.random.randint(0, 1000000)
|
|
562
541
|
obs, info = self.env.reset(seed=seed)
|
|
563
|
-
map_obs,
|
|
542
|
+
map_obs, _ = self.map_env.reset(seed=seed)
|
|
564
543
|
|
|
565
544
|
# Store info for accessing additional observations
|
|
566
545
|
self.current_info = info
|
|
@@ -588,9 +567,7 @@ class OpenCVLiveController:
|
|
|
588
567
|
action = self.action_map[key]
|
|
589
568
|
# Step both environments with the same action
|
|
590
569
|
obs, reward, terminated, truncated, info = self.env.step(action)
|
|
591
|
-
map_obs,
|
|
592
|
-
self.map_env.step(action)
|
|
593
|
-
)
|
|
570
|
+
map_obs, _, _, _, _ = self.map_env.step(action)
|
|
594
571
|
|
|
595
572
|
# Store info for accessing additional observations
|
|
596
573
|
self.current_info = info
|
|
@@ -622,7 +599,7 @@ class OpenCVLiveController:
|
|
|
622
599
|
# Reset both environments with same seed
|
|
623
600
|
seed = np.random.randint(0, 1000000)
|
|
624
601
|
obs, info = self.env.reset(seed=seed)
|
|
625
|
-
map_obs,
|
|
602
|
+
map_obs, _ = self.map_env.reset(seed=seed)
|
|
626
603
|
# Store info for accessing additional observations
|
|
627
604
|
self.current_info = info
|
|
628
605
|
# Extract observation array from dict
|
|
@@ -740,7 +717,7 @@ def main():
|
|
|
740
717
|
|
|
741
718
|
# Convert string to enum
|
|
742
719
|
obs_level_map = {
|
|
743
|
-
"FIRST_PERSON": ObservationLevel.
|
|
720
|
+
"FIRST_PERSON": ObservationLevel.FIRST_PERSON,
|
|
744
721
|
"TOP_DOWN_PARTIAL": ObservationLevel.TOP_DOWN_PARTIAL,
|
|
745
722
|
"TOP_DOWN_FULL": ObservationLevel.TOP_DOWN_FULL,
|
|
746
723
|
}
|
|
@@ -6,8 +6,10 @@ This example shows how to use the descriptive enum values instead of magic numbe
|
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
8
|
from PIL import Image
|
|
9
|
+
import gymnasium as gym
|
|
9
10
|
|
|
10
|
-
from miniworld_maze import
|
|
11
|
+
from miniworld_maze import ObservationLevel
|
|
12
|
+
import miniworld_maze # noqa: F401
|
|
11
13
|
|
|
12
14
|
|
|
13
15
|
def main():
|
|
@@ -27,10 +29,11 @@ def main():
|
|
|
27
29
|
print(f"\n🔍 Testing {obs_level.name}...")
|
|
28
30
|
|
|
29
31
|
# Create environment with specific observation level
|
|
30
|
-
env =
|
|
31
|
-
|
|
32
|
+
env = gym.make(
|
|
33
|
+
"NineRooms-v0",
|
|
32
34
|
obs_level=obs_level, # Using descriptive enum!
|
|
33
|
-
|
|
35
|
+
obs_width=64,
|
|
36
|
+
obs_height=64,
|
|
34
37
|
)
|
|
35
38
|
|
|
36
39
|
# Reset and get observation
|