miniworld-maze 1.0.0__py3-none-any.whl
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/__init__.py +37 -0
- miniworld_maze/core/__init__.py +8 -0
- miniworld_maze/core/constants.py +130 -0
- miniworld_maze/core/miniworld_gymnasium/README.md +1 -0
- miniworld_maze/core/miniworld_gymnasium/__init__.py +4 -0
- miniworld_maze/core/miniworld_gymnasium/base_env.py +52 -0
- miniworld_maze/core/miniworld_gymnasium/entities/__init__.py +7 -0
- miniworld_maze/core/miniworld_gymnasium/entities/agent.py +117 -0
- miniworld_maze/core/miniworld_gymnasium/entities/base_entity.py +135 -0
- miniworld_maze/core/miniworld_gymnasium/entities/objects.py +116 -0
- miniworld_maze/core/miniworld_gymnasium/entity_manager.py +358 -0
- miniworld_maze/core/miniworld_gymnasium/envs/__init__.py +3 -0
- miniworld_maze/core/miniworld_gymnasium/math.py +83 -0
- miniworld_maze/core/miniworld_gymnasium/objmesh.py +294 -0
- miniworld_maze/core/miniworld_gymnasium/occlusion_queries.py +97 -0
- miniworld_maze/core/miniworld_gymnasium/opengl.py +21 -0
- miniworld_maze/core/miniworld_gymnasium/params.py +128 -0
- miniworld_maze/core/miniworld_gymnasium/random.py +105 -0
- miniworld_maze/core/miniworld_gymnasium/rendering/__init__.py +7 -0
- miniworld_maze/core/miniworld_gymnasium/rendering/drawing.py +77 -0
- miniworld_maze/core/miniworld_gymnasium/rendering/framebuffer.py +260 -0
- miniworld_maze/core/miniworld_gymnasium/rendering/texture.py +101 -0
- miniworld_maze/core/miniworld_gymnasium/rendering_engine.py +293 -0
- miniworld_maze/core/miniworld_gymnasium/room.py +330 -0
- miniworld_maze/core/miniworld_gymnasium/texture_utils.py +64 -0
- miniworld_maze/core/miniworld_gymnasium/textures/airduct_grate_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/asphalt_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/beanpaste_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/beige_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/black_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/blueberry_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/brick_wall_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/cardboard_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/cardboard_2.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/cardboard_3.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/cardboard_4.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/ceiling_tile_noborder_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/ceiling_tiles_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/cinder_blocks_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/cobaltgreen_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/concrete_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/concrete_2.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/concrete_3.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/concrete_4.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/concrete_tiles_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/copperred_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/crimson_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/door_doom_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/door_doom_2.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/door_garage_red.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/door_garage_white.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/door_steel_brown.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/door_steel_grey.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/door_steel_red.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/drywall_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/floor_tiles_bw_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/floor_tiles_white.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/grass_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/grass_2.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/lava_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/lava_2.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/lemongrass_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/lightbeige_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/lightcobaltgreen_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/lightgray_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/lightnavyblue_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/lightskyblue_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/lime_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/logo_mila_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/magenta_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/marble_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/marble_2.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/metal_grill_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/metal_grill_2.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/morningglory_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/navyblue_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/oakbrown_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/orange_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/orchid_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/picket_fence_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/adelaide_hanscom1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/adelaide_hanscom1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/alessandro_allori1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/alessandro_allori1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/alessandro_allori2.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/alessandro_allori2.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/alexandre_cabanel1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/alexandre_cabanel1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/alexei_harlamov1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/alexei_harlamov1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/alexey_petrovich_antropov1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/alexey_petrovich_antropov1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/alice_pike_barney1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/alice_pike_barney1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/aman_theodor1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/aman_theodor1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/antonello_messina1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/antonello_messina1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/antonio_herrera_toro1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/antonio_herrera_toro1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/benjamin-constant1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/benjamin-constant1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/benoist_marie-guillemine1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/benoist_marie-guillemine1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/bouguereau_william-adolphe1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/bouguereau_william-adolphe1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/byron1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/byron1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/carl_fredric_breda1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/carl_fredric_breda1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/carl_fredric_breda2.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/carl_fredric_breda2.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/cramacj_lucas1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/cramacj_lucas1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/cranach_lucas2.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/cranach_lucas2.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/cristobal_rojas1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/cristobal_rojas1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/delacroix_eugene_ferdinand_victor1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/delacroix_eugene_ferdinand_victor1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/domenikos_theotokopoulos1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/domenikos_theotokopoulos1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/edmund_blair_leighton1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/edmund_blair_leighton1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/edmund_blair_leighton2.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/edmund_blair_leighton2.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/edwin_longsden_long1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/edwin_longsden_long1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/falero_luis_ricardo1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/falero_luis_ricardo1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/felix_bonfils1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/felix_bonfils1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/francesco_hayez1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/francesco_hayez1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/francisco_goya_lucientes1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/francisco_goya_lucientes1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/francisco_goya_lucientes2.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/francisco_goya_lucientes2.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/francisco_zurbaran1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/francisco_zurbaran1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/franz_von_defregger1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/franz_von_defregger1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/franz_von_defregger2.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/franz_von_defregger2.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/franz_von_defregger3.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/franz_von_defregger3.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/frederic_westin1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/frederic_westin1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/frederic_yates1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/frederic_yates1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/frederick_leighton1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/frederick_leighton1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/gaston_bussiere1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/gaston_bussiere1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/george_henry_hall1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/george_henry_hall1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/giovanni_battista_tiepolo1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/giovanni_battista_tiepolo1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/giovanni_bellini1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/giovanni_bellini1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/hans_holbein1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/hans_holbein1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/hayez_francesco1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/hayez_francesco1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/henryk_siemiradzki1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/henryk_siemiradzki1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/ilja_jefimowitsch_repin1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/ilja_jefimowitsch_repin1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/james_carrol_beckwith1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/james_carrol_beckwith1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-baptiste-camille_corot1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-baptiste-camille_corot1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-baptiste-camille_corot2.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-baptiste-camille_corot2.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome2.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome2.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome3.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome3.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome4.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/jean-leon_gerome4.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/john_william_godward1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/john_william_godward1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/john_william_godward2.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/john_william_godward2.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/john_william_godward3.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/john_william_godward3.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/julije_klovic1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/julije_klovic1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/juriaen_streek1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/juriaen_streek1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/kiprenskij_orest_adamovic1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/kiprenskij_orest_adamovic1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/konstantin_makovsky1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/konstantin_makovsky1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/lefebvre_jules_joseph1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/lefebvre_jules_joseph1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/leon-francois_comerre1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/leon-francois_comerre1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/leopold_loffler1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/leopold_loffler1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/lewis_john_frederick1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/lewis_john_frederick1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/madrazo_garreta_raimundo1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/madrazo_garreta_raimundo1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/marie_bashkirtseff1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/marie_bashkirtseff1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/moritz_kellerhoven1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/moritz_kellerhoven1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/nathaniel_jocelyn1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/nathaniel_jocelyn1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/nikolai_alexandrowitsch_jaroschenko1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/nikolai_alexandrowitsch_jaroschenko1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/nils_johan_olsson_blommer1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/nils_johan_olsson_blommer1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/paolo_veronese1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/paolo_veronese1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/parmigianino1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/parmigianino1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/paul_cesar_helleu1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/paul_cesar_helleu1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/regnault_henri1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/regnault_henri1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/richard_bergh1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/richard_bergh1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/richard_bergh2.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/richard_bergh2.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/robert_dampier1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/robert_dampier1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/robert_lefevre1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/robert_lefevre1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/robert_leopold1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/robert_leopold1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/sichel_nathanael1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/sichel_nathanael1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/svetoslav_roerich1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/svetoslav_roerich1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/velazquez_diego1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/velazquez_diego1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/viktor_vasnetsov1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/viktor_vasnetsov1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/william-adolphe_bouguereau1.license +2 -0
- miniworld_maze/core/miniworld_gymnasium/textures/portraits/william-adolphe_bouguereau1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/realblueberry_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/redbean_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/rock_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/seablue_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/silver_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/skyblue_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/slime_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/stucco_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/sunnyyellow_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/turquoise_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/violet_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/water_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/water_2.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/water_3.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/white_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/wood_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/wood_2.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/textures/wood_planks_1.png +0 -0
- miniworld_maze/core/miniworld_gymnasium/unified_env.py +1364 -0
- miniworld_maze/core/miniworld_gymnasium/utils.py +37 -0
- miniworld_maze/core/miniworld_gymnasium/wrappers.py +2 -0
- miniworld_maze/core/observation_types.py +32 -0
- miniworld_maze/environments/__init__.py +16 -0
- miniworld_maze/environments/base_grid_rooms.py +204 -0
- miniworld_maze/environments/factory.py +155 -0
- miniworld_maze/environments/nine_rooms.py +74 -0
- miniworld_maze/environments/spiral_nine_rooms.py +70 -0
- miniworld_maze/environments/twenty_five_rooms.py +122 -0
- miniworld_maze/tools/__init__.py +5 -0
- miniworld_maze/tools/generate_observations.py +199 -0
- miniworld_maze/wrappers/__init__.py +5 -0
- miniworld_maze/wrappers/image_transforms.py +40 -0
- miniworld_maze-1.0.0.dist-info/METADATA +108 -0
- miniworld_maze-1.0.0.dist-info/RECORD +280 -0
- miniworld_maze-1.0.0.dist-info/WHEEL +4 -0
- miniworld_maze-1.0.0.dist-info/entry_points.txt +3 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"""Drawing utility functions for MiniWorld environments."""
|
|
2
|
+
|
|
3
|
+
from pyglet.gl import *
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def drawAxes(axis_length=0.1):
|
|
7
|
+
"""
|
|
8
|
+
Draw coordinate system axes in red/green/blue colors.
|
|
9
|
+
|
|
10
|
+
Renders X, Y, Z axes as colored line segments for debugging and visualization.
|
|
11
|
+
X-axis is red, Y-axis is green, Z-axis is blue.
|
|
12
|
+
|
|
13
|
+
Args:
|
|
14
|
+
axis_length (float): Length of each axis line, defaults to 0.1 units
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
glBegin(GL_LINES)
|
|
18
|
+
|
|
19
|
+
glColor3f(1, 0, 0)
|
|
20
|
+
glVertex3f(0, 0, 0)
|
|
21
|
+
glVertex3f(axis_length, 0, 0)
|
|
22
|
+
|
|
23
|
+
glColor3f(0, 1, 0)
|
|
24
|
+
glVertex3f(0, 0, 0)
|
|
25
|
+
glVertex3f(0, axis_length, 0)
|
|
26
|
+
|
|
27
|
+
glColor3f(0, 0, 1)
|
|
28
|
+
glVertex3f(0, 0, 0)
|
|
29
|
+
glVertex3f(0, 0, axis_length)
|
|
30
|
+
|
|
31
|
+
glEnd()
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def drawBox(x_min, x_max, y_min, y_max, z_min, z_max):
|
|
35
|
+
"""
|
|
36
|
+
Draw a 3D box
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
glBegin(GL_QUADS)
|
|
40
|
+
|
|
41
|
+
glNormal3f(0, 0, 1)
|
|
42
|
+
glVertex3f(x_max, y_max, z_max)
|
|
43
|
+
glVertex3f(x_min, y_max, z_max)
|
|
44
|
+
glVertex3f(x_min, y_min, z_max)
|
|
45
|
+
glVertex3f(x_max, y_min, z_max)
|
|
46
|
+
|
|
47
|
+
glNormal3f(0, 0, -1)
|
|
48
|
+
glVertex3f(x_min, y_max, z_min)
|
|
49
|
+
glVertex3f(x_max, y_max, z_min)
|
|
50
|
+
glVertex3f(x_max, y_min, z_min)
|
|
51
|
+
glVertex3f(x_min, y_min, z_min)
|
|
52
|
+
|
|
53
|
+
glNormal3f(-1, 0, 0)
|
|
54
|
+
glVertex3f(x_min, y_max, z_max)
|
|
55
|
+
glVertex3f(x_min, y_max, z_min)
|
|
56
|
+
glVertex3f(x_min, y_min, z_min)
|
|
57
|
+
glVertex3f(x_min, y_min, z_max)
|
|
58
|
+
|
|
59
|
+
glNormal3f(1, 0, 0)
|
|
60
|
+
glVertex3f(x_max, y_max, z_min)
|
|
61
|
+
glVertex3f(x_max, y_max, z_max)
|
|
62
|
+
glVertex3f(x_max, y_min, z_max)
|
|
63
|
+
glVertex3f(x_max, y_min, z_min)
|
|
64
|
+
|
|
65
|
+
glNormal3f(0, 1, 0)
|
|
66
|
+
glVertex3f(x_max, y_max, z_max)
|
|
67
|
+
glVertex3f(x_max, y_max, z_min)
|
|
68
|
+
glVertex3f(x_min, y_max, z_min)
|
|
69
|
+
glVertex3f(x_min, y_max, z_max)
|
|
70
|
+
|
|
71
|
+
glNormal3f(0, -1, 0)
|
|
72
|
+
glVertex3f(x_max, y_min, z_min)
|
|
73
|
+
glVertex3f(x_max, y_min, z_max)
|
|
74
|
+
glVertex3f(x_min, y_min, z_max)
|
|
75
|
+
glVertex3f(x_min, y_min, z_min)
|
|
76
|
+
|
|
77
|
+
glEnd()
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"""Frame buffer management for MiniWorld environments."""
|
|
2
|
+
|
|
3
|
+
from ctypes import POINTER, byref
|
|
4
|
+
|
|
5
|
+
import numpy as np
|
|
6
|
+
from pyglet.gl import *
|
|
7
|
+
|
|
8
|
+
# Mapping of frame buffer error enums to strings
|
|
9
|
+
FB_ERROR_ENUMS = {
|
|
10
|
+
GL_FRAMEBUFFER_UNDEFINED: "GL_FRAMEBUFFER_UNDEFINED",
|
|
11
|
+
GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT",
|
|
12
|
+
GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT",
|
|
13
|
+
GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER: "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER",
|
|
14
|
+
GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER: "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER",
|
|
15
|
+
GL_FRAMEBUFFER_UNSUPPORTED: "GL_FRAMEBUFFER_UNSUPPORTED",
|
|
16
|
+
GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE",
|
|
17
|
+
GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE",
|
|
18
|
+
GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS: "GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS",
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class FrameBuffer:
|
|
23
|
+
"""
|
|
24
|
+
Manage frame buffers for rendering
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
def __init__(self, width, height, num_samples=1):
|
|
28
|
+
"""Create the frame buffer objects"""
|
|
29
|
+
|
|
30
|
+
assert num_samples > 0
|
|
31
|
+
assert num_samples <= 16
|
|
32
|
+
|
|
33
|
+
self.width = width
|
|
34
|
+
self.height = height
|
|
35
|
+
|
|
36
|
+
# Create a frame buffer (rendering target)
|
|
37
|
+
self.multi_fbo = GLuint(0)
|
|
38
|
+
glGenFramebuffers(1, byref(self.multi_fbo))
|
|
39
|
+
glBindFramebuffer(GL_FRAMEBUFFER, self.multi_fbo)
|
|
40
|
+
|
|
41
|
+
# The try block here is because some OpenGL drivers
|
|
42
|
+
# (Intel GPU drivers on MacBooks in particular) do not
|
|
43
|
+
# support multisampling on frame buffer objects
|
|
44
|
+
try:
|
|
45
|
+
# Ensure that the correct extension is supported
|
|
46
|
+
assert gl_info.have_extension("GL_EXT_framebuffer_multisample")
|
|
47
|
+
|
|
48
|
+
# Get the maximum number of samples supported
|
|
49
|
+
MAX_SAMPLES_EXT = 0x8D57
|
|
50
|
+
max_samples = (GLint)()
|
|
51
|
+
glGetIntegerv(MAX_SAMPLES_EXT, max_samples)
|
|
52
|
+
max_samples = max_samples.value
|
|
53
|
+
|
|
54
|
+
if num_samples > max_samples:
|
|
55
|
+
print("Falling back to num_samples={}".format(max_samples))
|
|
56
|
+
num_samples = max_samples
|
|
57
|
+
|
|
58
|
+
# Create a multisampled texture to render into
|
|
59
|
+
fbTex = GLuint(0)
|
|
60
|
+
glGenTextures(1, byref(fbTex))
|
|
61
|
+
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, fbTex)
|
|
62
|
+
glTexImage2DMultisample(
|
|
63
|
+
GL_TEXTURE_2D_MULTISAMPLE, num_samples, GL_RGBA32F, width, height, True
|
|
64
|
+
)
|
|
65
|
+
glFramebufferTexture2D(
|
|
66
|
+
GL_FRAMEBUFFER,
|
|
67
|
+
GL_COLOR_ATTACHMENT0,
|
|
68
|
+
GL_TEXTURE_2D_MULTISAMPLE,
|
|
69
|
+
fbTex,
|
|
70
|
+
0,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
# Attach a multisampled depth buffer to the FBO
|
|
74
|
+
depth_rb = GLuint(0)
|
|
75
|
+
glGenRenderbuffers(1, byref(depth_rb))
|
|
76
|
+
glBindRenderbuffer(GL_RENDERBUFFER, depth_rb)
|
|
77
|
+
glRenderbufferStorageMultisample(
|
|
78
|
+
GL_RENDERBUFFER, num_samples, GL_DEPTH_COMPONENT16, width, height
|
|
79
|
+
)
|
|
80
|
+
glFramebufferRenderbuffer(
|
|
81
|
+
GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth_rb
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
# Check that the frame buffer creation succeeded
|
|
85
|
+
res = glCheckFramebufferStatus(GL_FRAMEBUFFER)
|
|
86
|
+
assert res == GL_FRAMEBUFFER_COMPLETE, FB_ERROR_ENUMS.get(res, res)
|
|
87
|
+
|
|
88
|
+
except:
|
|
89
|
+
print("Falling back to non-multisampled frame buffer")
|
|
90
|
+
|
|
91
|
+
# Create a plain texture texture to render into
|
|
92
|
+
fbTex = GLuint(0)
|
|
93
|
+
glGenTextures(1, byref(fbTex))
|
|
94
|
+
glBindTexture(GL_TEXTURE_2D, fbTex)
|
|
95
|
+
glTexImage2D(
|
|
96
|
+
GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_FLOAT, None
|
|
97
|
+
)
|
|
98
|
+
glFramebufferTexture2D(
|
|
99
|
+
GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbTex, 0
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
# Attach depth buffer to FBO
|
|
103
|
+
depth_rb = GLuint(0)
|
|
104
|
+
glGenRenderbuffers(1, byref(depth_rb))
|
|
105
|
+
glBindRenderbuffer(GL_RENDERBUFFER, depth_rb)
|
|
106
|
+
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height)
|
|
107
|
+
glFramebufferRenderbuffer(
|
|
108
|
+
GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth_rb
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
# Sanity check
|
|
112
|
+
res = glCheckFramebufferStatus(GL_FRAMEBUFFER)
|
|
113
|
+
assert res == GL_FRAMEBUFFER_COMPLETE, FB_ERROR_ENUMS.get(res, res)
|
|
114
|
+
|
|
115
|
+
# Create the frame buffer used to resolve the final render
|
|
116
|
+
self.final_fbo = GLuint(0)
|
|
117
|
+
glGenFramebuffers(1, byref(self.final_fbo))
|
|
118
|
+
glBindFramebuffer(GL_FRAMEBUFFER, self.final_fbo)
|
|
119
|
+
|
|
120
|
+
# Create the texture used to resolve the final render
|
|
121
|
+
fbTex = GLuint(0)
|
|
122
|
+
glGenTextures(1, byref(fbTex))
|
|
123
|
+
glBindTexture(GL_TEXTURE_2D, fbTex)
|
|
124
|
+
glTexImage2D(
|
|
125
|
+
GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_FLOAT, None
|
|
126
|
+
)
|
|
127
|
+
glFramebufferTexture2D(
|
|
128
|
+
GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbTex, 0
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
# Create a depth buffer for the final frame buffer
|
|
132
|
+
depth_rb = GLuint(0)
|
|
133
|
+
glGenRenderbuffers(1, byref(depth_rb))
|
|
134
|
+
glBindRenderbuffer(GL_RENDERBUFFER, depth_rb)
|
|
135
|
+
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height)
|
|
136
|
+
glFramebufferRenderbuffer(
|
|
137
|
+
GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth_rb
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
# Sanity check
|
|
141
|
+
res = glCheckFramebufferStatus(GL_FRAMEBUFFER)
|
|
142
|
+
assert res == GL_FRAMEBUFFER_COMPLETE, FB_ERROR_ENUMS.get(res, res)
|
|
143
|
+
|
|
144
|
+
# Enable depth testing
|
|
145
|
+
glEnable(GL_DEPTH_TEST)
|
|
146
|
+
|
|
147
|
+
# Unbind the frame buffer
|
|
148
|
+
glBindFramebuffer(GL_FRAMEBUFFER, 0)
|
|
149
|
+
|
|
150
|
+
# Array to render the image into (for observation rendering)
|
|
151
|
+
# The array is stored in column-major order
|
|
152
|
+
self.img_array = np.zeros(shape=(height, width, 3), dtype=np.uint8)
|
|
153
|
+
|
|
154
|
+
def bind(self):
|
|
155
|
+
"""
|
|
156
|
+
Bind the frame buffer before rendering into it
|
|
157
|
+
"""
|
|
158
|
+
|
|
159
|
+
# Bind the multisampled frame buffer
|
|
160
|
+
glEnable(GL_MULTISAMPLE)
|
|
161
|
+
glBindFramebuffer(GL_FRAMEBUFFER, self.multi_fbo)
|
|
162
|
+
glViewport(0, 0, self.width, self.height)
|
|
163
|
+
|
|
164
|
+
def resolve(self):
|
|
165
|
+
"""
|
|
166
|
+
Produce a numpy image array from the rendered image
|
|
167
|
+
"""
|
|
168
|
+
|
|
169
|
+
# Resolve the multisampled frame buffer into the final frame buffer
|
|
170
|
+
glBindFramebuffer(GL_READ_FRAMEBUFFER, self.multi_fbo)
|
|
171
|
+
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, self.final_fbo)
|
|
172
|
+
glBlitFramebuffer(
|
|
173
|
+
0,
|
|
174
|
+
0,
|
|
175
|
+
self.width,
|
|
176
|
+
self.height,
|
|
177
|
+
0,
|
|
178
|
+
0,
|
|
179
|
+
self.width,
|
|
180
|
+
self.height,
|
|
181
|
+
GL_COLOR_BUFFER_BIT,
|
|
182
|
+
GL_LINEAR,
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
# Resolve the depth component as well
|
|
186
|
+
glBlitFramebuffer(
|
|
187
|
+
0,
|
|
188
|
+
0,
|
|
189
|
+
self.width,
|
|
190
|
+
self.height,
|
|
191
|
+
0,
|
|
192
|
+
0,
|
|
193
|
+
self.width,
|
|
194
|
+
self.height,
|
|
195
|
+
GL_DEPTH_BUFFER_BIT,
|
|
196
|
+
GL_NEAREST,
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
# Copy the frame buffer contents into a numpy array
|
|
200
|
+
# Note: glReadPixels reads starting from the lower left corner
|
|
201
|
+
glBindFramebuffer(GL_FRAMEBUFFER, self.final_fbo)
|
|
202
|
+
glPixelStorei(GL_PACK_ALIGNMENT, 1)
|
|
203
|
+
glReadPixels(
|
|
204
|
+
0,
|
|
205
|
+
0,
|
|
206
|
+
self.width,
|
|
207
|
+
self.height,
|
|
208
|
+
GL_RGB,
|
|
209
|
+
GL_UNSIGNED_BYTE,
|
|
210
|
+
self.img_array.ctypes.data_as(POINTER(GLubyte)),
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
# Unbind the frame buffer
|
|
214
|
+
glBindFramebuffer(GL_FRAMEBUFFER, 0)
|
|
215
|
+
|
|
216
|
+
# Flip the image because OpenGL maps (0,0) to the lower-left corner
|
|
217
|
+
# Note: this is necessary for gym.wrappers.Monitor to record videos
|
|
218
|
+
# properly, otherwise they are vertically inverted.
|
|
219
|
+
# Note: ascontiguousarray operates in constant time because it
|
|
220
|
+
# does not copy the data
|
|
221
|
+
img = np.ascontiguousarray(np.flip(self.img_array, axis=0))
|
|
222
|
+
|
|
223
|
+
return img
|
|
224
|
+
|
|
225
|
+
def get_depth_map(self, z_near=0.04, z_far=1.0):
|
|
226
|
+
"""
|
|
227
|
+
Read the depth buffer into a depth map
|
|
228
|
+
The values returned are real-world z-distance from the observer
|
|
229
|
+
"""
|
|
230
|
+
|
|
231
|
+
depth_map = np.zeros(shape=(self.height, self.width, 1), dtype=np.uint16)
|
|
232
|
+
|
|
233
|
+
glBindFramebuffer(GL_FRAMEBUFFER, self.final_fbo)
|
|
234
|
+
glPixelStorei(GL_PACK_ALIGNMENT, 1)
|
|
235
|
+
glReadPixels(
|
|
236
|
+
0,
|
|
237
|
+
0,
|
|
238
|
+
self.width,
|
|
239
|
+
self.height,
|
|
240
|
+
GL_DEPTH_COMPONENT,
|
|
241
|
+
GL_UNSIGNED_SHORT,
|
|
242
|
+
depth_map.ctypes.data_as(POINTER(GLushort)),
|
|
243
|
+
)
|
|
244
|
+
|
|
245
|
+
# Unbind the frame buffer
|
|
246
|
+
glBindFramebuffer(GL_FRAMEBUFFER, 0)
|
|
247
|
+
|
|
248
|
+
# Flip the depth map vertically to map OpenAI gym conventions
|
|
249
|
+
depth_map = np.flip(depth_map, axis=0)
|
|
250
|
+
|
|
251
|
+
# Transform into floating-point values
|
|
252
|
+
depth_map = depth_map.astype(np.float32) / 65535
|
|
253
|
+
|
|
254
|
+
# Convert to real-world z-distances
|
|
255
|
+
clip_z = (depth_map - 0.5) * 2.0
|
|
256
|
+
world_z = -2 * z_far * z_near / (clip_z * (z_far - z_near) - (z_far + z_near))
|
|
257
|
+
|
|
258
|
+
depth_map = np.ascontiguousarray(world_z)
|
|
259
|
+
|
|
260
|
+
return depth_map
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"""Texture management for MiniWorld environments."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
|
|
5
|
+
import pyglet
|
|
6
|
+
from pyglet.gl import *
|
|
7
|
+
|
|
8
|
+
from ..utils import get_file_path
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Texture:
|
|
12
|
+
"""
|
|
13
|
+
Manage the loading and caching of textures, as well as texture randomization
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
# List of textures available for a given path
|
|
17
|
+
tex_paths = {}
|
|
18
|
+
|
|
19
|
+
# Cache of textures
|
|
20
|
+
tex_cache = {}
|
|
21
|
+
|
|
22
|
+
@classmethod
|
|
23
|
+
def get(self, tex_name, rng=None):
|
|
24
|
+
"""
|
|
25
|
+
Load a texture by name (or used a cached version)
|
|
26
|
+
Also performs domain randomization if multiple versions are available.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
paths = self.tex_paths.get(tex_name, [])
|
|
30
|
+
|
|
31
|
+
# Get an inventory of the existing texture files
|
|
32
|
+
if len(paths) == 0:
|
|
33
|
+
for i in range(1, 10):
|
|
34
|
+
path = get_file_path("textures", "%s_%d" % (tex_name, i), "png")
|
|
35
|
+
|
|
36
|
+
if not os.path.exists(path):
|
|
37
|
+
break
|
|
38
|
+
paths.append(path)
|
|
39
|
+
|
|
40
|
+
assert len(paths) > 0, 'failed to load textures for name "%s"' % tex_name
|
|
41
|
+
|
|
42
|
+
# If domain-randomization is to be used
|
|
43
|
+
if rng:
|
|
44
|
+
path_idx = rng.int(0, len(paths))
|
|
45
|
+
path = paths[path_idx]
|
|
46
|
+
else:
|
|
47
|
+
path = paths[0]
|
|
48
|
+
|
|
49
|
+
if path not in self.tex_cache:
|
|
50
|
+
self.tex_cache[path] = Texture(Texture.load(path), tex_name)
|
|
51
|
+
|
|
52
|
+
return self.tex_cache[path]
|
|
53
|
+
|
|
54
|
+
@classmethod
|
|
55
|
+
def load(cls, tex_path):
|
|
56
|
+
"""
|
|
57
|
+
Load a texture based on its path. No domain randomization.
|
|
58
|
+
In mose cases, this method should not be used directly.
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
# print('Loading texture "%s"' % tex_path)
|
|
62
|
+
|
|
63
|
+
img = pyglet.image.load(tex_path)
|
|
64
|
+
tex = img.get_texture()
|
|
65
|
+
glEnable(tex.target)
|
|
66
|
+
glBindTexture(tex.target, tex.id)
|
|
67
|
+
|
|
68
|
+
glTexImage2D(
|
|
69
|
+
GL_TEXTURE_2D,
|
|
70
|
+
0,
|
|
71
|
+
GL_RGB,
|
|
72
|
+
img.width,
|
|
73
|
+
img.height,
|
|
74
|
+
0,
|
|
75
|
+
GL_RGBA,
|
|
76
|
+
GL_UNSIGNED_BYTE,
|
|
77
|
+
img.get_image_data().get_data("RGBA", img.width * 4),
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
# Generate mipmaps (multiple levels of detail)
|
|
81
|
+
glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST)
|
|
82
|
+
glGenerateMipmap(GL_TEXTURE_2D)
|
|
83
|
+
|
|
84
|
+
# Trilinear texture filtering
|
|
85
|
+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
|
|
86
|
+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR)
|
|
87
|
+
|
|
88
|
+
# Unbind the texture
|
|
89
|
+
glBindTexture(GL_TEXTURE_2D, 0)
|
|
90
|
+
|
|
91
|
+
return tex
|
|
92
|
+
|
|
93
|
+
def __init__(self, tex, tex_name):
|
|
94
|
+
assert not isinstance(tex, str)
|
|
95
|
+
self.tex = tex
|
|
96
|
+
self.width = self.tex.width
|
|
97
|
+
self.height = self.tex.height
|
|
98
|
+
self.name = tex_name
|
|
99
|
+
|
|
100
|
+
def bind(self):
|
|
101
|
+
glBindTexture(self.tex.target, self.tex.id)
|