diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 62543c13c..e0a60a7c4 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -24,7 +24,7 @@ If applicable, add screenshots to help explain your problem. **Desktop (please complete the following information):** - OS: [e.g. mac/linux/windows] - - Version [e.g. 1.2.23] + - Version [e.g. 1.2.24] **Additional context** Add any other context about the problem here. diff --git a/CMakeLists.txt b/CMakeLists.txt index 8a5fb3b25..5787a3fdd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.10.0) -project(Griddly VERSION 1.2.23) +project(Griddly VERSION 1.2.24) set(BINARY ${CMAKE_PROJECT_NAME}) diff --git a/LICENSE b/LICENSE index a0c45480e..4c561f17f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020 Chris Bamford +Copyright (c) 2022 Chris Bamford Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 17b5bda6d..1714f20eb 100644 --- a/README.md +++ b/README.md @@ -1,43 +1,98 @@ -# Griddly +#

![Griddly Bear](resources/images/gvgai/oryx/bear2.png) Griddly ![Griddly Bear](resources/images/gvgai/oryx/bear2.png)

+
-A cross platform grid-based research environment that is designed to be able to reproduce grid-world style games. -[![Documentation Status](https://readthedocs.org/projects/griddly/badge/?version=latest)](https://griddly.readthedocs.io/en/latest/?badge=latest) +[![Discord Chat](https://img.shields.io/discord/728222413397164142.svg)](https://discord.gg/xuR8Dsv) +[![PyPI version](https://badge.fury.io/py/griddly.svg)](https://badge.fury.io/py/griddly) -Build Status -| OS | Status | -|----------|----------| -| Linux | [![Build Status](https://dev.azure.com/chrisbam4d/Griddly/_apis/build/status/Bam4d.Griddly?branchName=develop&jobName=Linux)](https://dev.azure.com/chrisbam4d/Griddly/_build/latest?definitionId=1&branchName=develop) | -| Windows | [![Build Status](https://dev.azure.com/chrisbam4d/Griddly/_apis/build/status/Bam4d.Griddly?branchName=develop&jobName=Windows)](https://dev.azure.com/chrisbam4d/Griddly/_build/latest?definitionId=1&branchName=develop) | -| MacOS | [![Build Status](https://dev.azure.com/chrisbam4d/Griddly/_apis/build/status/Bam4d.Griddly?branchName=develop&jobName=MacOS)](https://dev.azure.com/chrisbam4d/Griddly/_build/latest?definitionId=1&branchName=develop) | +
-# Community -Join the Discord community for help and to talk about what you are doing with Griddly! -[![Discord Chat](https://img.shields.io/discord/728222413397164142.svg)](https://discord.gg/xuR8Dsv) -# Documentation +A heavily optimized and flexible grid-world game engine for Game AI research. + +# ![BOOM](resources/images/gvgai/oryx/sparkle3.png) Some features +* Design and build game mechanics using a simple YAML-based language: [GDY](https://griddly.readthedocs.io/en/latest/getting-started/gdy/index.html) +* **Fast execution speed** environments can run up to 70k FPS on a single thread. +* Don't worry about complex efficient rendering code, just define the images for each game object and Griddly passes this to the GPU. +* Supports **Single Agent**, **Multi Agent** and **RTS** environment interfaces. +* **[Multiple observervation modes](https://griddly.readthedocs.io/en/latest/getting-started/observation%20spaces/index.html)**: + * Vectorized + * Configurable one-hot encodings for each x,y coordinate + * Rendered + * Isometric, sprites and simple shapes + * We also let you use **custom shaders** to render however you want! + * State Maps + * Description of the entire environment including objects, locations and variables. + * Event History + * Descriptions of actions that have happened in each step. + * Configurable partial observability +* **Copyable Forward Models** + * Game state can be cloned at any point in time. This is super useful for many Algorithms. For example Mont-Carlo Tree Search. +* **[Procedural Content Generation Interfaces](https://griddly.readthedocs.io/en/latest/getting-started/procedural%20content%20generation/index.html)** + + +* Reinforcement Learning with [RLLib](https://griddly.readthedocs.io/en/latest/rllib/intro/index.html) + * Integration with [Wandb](https://griddly.readthedocs.io/en/latest/rllib/intro/index.html#weights-and-biases-wandb) + + +# ![WHOOSH!!](resources/images/gvgai/oryx/tree2.png) Some Environments + +
+ + + +
+ +[Check out the full list of pre-built environments here](https://griddly.readthedocs.io/en/latest/games/index.html) -This documentation is only for building from source. + + +# ![Community](resources/images/oryx/oryx_fantasy/avatars/doggo1.png) Community +Join the [Discord community](https://discord.gg/xuR8Dsv) for help and to talk about what you are doing with Griddly! + + + +# ![Documentation](resources/images/oryx/oryx_fantasy/bookshelf-1.png) Documentation Full documentation can be found here: [griddly.readthedocs.org](https://griddly.readthedocs.org) -## Installing Without Building Locally +# ![Tutorials](resources/images/gvgai/oryx/book1.png) ![Tutorials](resources/images/gvgai/oryx/book2.png) ![Tutorials](resources/images/gvgai/oryx/book3.png) Tutorials + +The most awesome part of Griddly is the ability to easily customize and build your own research environments. To make this extra easy we've written lots of tutorials: + +## [Getting Started](https://griddly.readthedocs.org) +## Game Mechanics + * [Proximity Triggers](https://griddly.readthedocs.io/en/latest/tutorials/Proximity%20Triggers/index.html) + * Configure interactions between objects based on their distance. + +## [Custom Shaders](https://griddly.readthedocs.io/en/latest/tutorials/Custom%20Shaders/index.html) + * Customize rendering for environments using SPIR-V shaders. +
+ + + +
-### Python +# ![Installing](resources/images/gvgai/oryx/hammer1.png) Installing -To install Griddly without building from source just install from pypi: +
``` pip install griddly -``` +``` -### Java (Coming Soon) +Build Status +| OS | Status | +|----------|----------| +| Linux | [![Build Status](https://dev.azure.com/chrisbam4d/Griddly/_apis/build/status/Bam4d.Griddly?branchName=develop&jobName=Linux)](https://dev.azure.com/chrisbam4d/Griddly/_build/latest?definitionId=1&branchName=develop) | +| Windows | [![Build Status](https://dev.azure.com/chrisbam4d/Griddly/_apis/build/status/Bam4d.Griddly?branchName=develop&jobName=Windows)](https://dev.azure.com/chrisbam4d/Griddly/_build/latest?definitionId=1&branchName=develop) | +| MacOS | [![Build Status](https://dev.azure.com/chrisbam4d/Griddly/_apis/build/status/Bam4d.Griddly?branchName=develop&jobName=MacOS)](https://dev.azure.com/chrisbam4d/Griddly/_build/latest?definitionId=1&branchName=develop) | -Java library support will be developed using [JavaCpp](https://github.com/bytedeco/javacpp) +
-# Building locally +# ![Installing](resources/images/gvgai/oryx/staff1.png) Building locally Firstly sync up the git submodules: diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 6c0b85bef..aacf3c58c 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -14,7 +14,7 @@ pr: jobs: - job: Linux - timeoutInMinutes: 30 + timeoutInMinutes: 40 pool: vmImage: "ubuntu-18.04" steps: @@ -74,7 +74,7 @@ jobs: - job: PyPiDeployLinux dependsOn: Linux condition: and(succeeded(), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), contains(variables['Build.SourceBranch'], 'test_deploy'))) - timeoutInMinutes: 30 + timeoutInMinutes: 40 pool: vmImage: "ubuntu-18.04" strategy: @@ -133,7 +133,7 @@ jobs: - job: Windows variables: VULKAN_SDK: C:/VulkanSDK/1.2.148.0 - timeoutInMinutes: 30 + timeoutInMinutes: 40 pool: vmImage: "windows-latest" steps: @@ -198,7 +198,7 @@ jobs: dependsOn: Windows variables: VULKAN_SDK: C:/VulkanSDK/1.2.148.0 - timeoutInMinutes: 30 + timeoutInMinutes: 40 pool: vmImage: "windows-latest" strategy: diff --git a/bindings/python.cpp b/bindings/python.cpp index 0e85b2f32..26e006950 100644 --- a/bindings/python.cpp +++ b/bindings/python.cpp @@ -12,7 +12,7 @@ namespace griddly { PYBIND11_MODULE(python_griddly, m) { m.doc() = "Griddly python bindings"; - m.attr("version") = "1.2.23"; + m.attr("version") = "1.2.24"; #ifndef NDEBUG spdlog::set_level(spdlog::level::debug); diff --git a/docs/_static/video/tutorials/custom_shaders/global_lighting/global_video_test.mp4 b/docs/_static/video/tutorials/custom_shaders/global_lighting/global_video_test.mp4 new file mode 100644 index 000000000..94b4c8b37 Binary files /dev/null and b/docs/_static/video/tutorials/custom_shaders/global_lighting/global_video_test.mp4 differ diff --git a/docs/_static/video/tutorials/custom_shaders/health_bars/global_video_test.mp4 b/docs/_static/video/tutorials/custom_shaders/health_bars/global_video_test.mp4 new file mode 100644 index 000000000..fc80547ae Binary files /dev/null and b/docs/_static/video/tutorials/custom_shaders/health_bars/global_video_test.mp4 differ diff --git a/docs/_static/video/tutorials/custom_shaders/object_lighting/global_video_test.mp4 b/docs/_static/video/tutorials/custom_shaders/object_lighting/global_video_test.mp4 new file mode 100644 index 000000000..56d89bf9e Binary files /dev/null and b/docs/_static/video/tutorials/custom_shaders/object_lighting/global_video_test.mp4 differ diff --git a/docs/conf.py b/docs/conf.py index be697b481..ccbc3c56d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -18,11 +18,11 @@ # -- Project information ----------------------------------------------------- project = 'Griddly' -copyright = '2020, Chris Bamford' +copyright = '2022, Chris Bamford' author = 'Chris Bamford' # The full version, including alpha/beta/rc tags -release = '1.2.23' +release = '1.2.24' # -- General configuration --------------------------------------------------- diff --git a/docs/games/Bait/img/Bait-level-Block2D-0.png b/docs/games/Bait/img/Bait-level-Block2D-0.png index 09434b604..6a9687a6c 100644 Binary files a/docs/games/Bait/img/Bait-level-Block2D-0.png and b/docs/games/Bait/img/Bait-level-Block2D-0.png differ diff --git a/docs/games/Bait/img/Bait-level-Block2D-1.png b/docs/games/Bait/img/Bait-level-Block2D-1.png index 26fb4a873..9dfa12cf3 100644 Binary files a/docs/games/Bait/img/Bait-level-Block2D-1.png and b/docs/games/Bait/img/Bait-level-Block2D-1.png differ diff --git a/docs/games/Bait/img/Bait-level-Block2D-2.png b/docs/games/Bait/img/Bait-level-Block2D-2.png index bd2110cf0..73d1d14a9 100644 Binary files a/docs/games/Bait/img/Bait-level-Block2D-2.png and b/docs/games/Bait/img/Bait-level-Block2D-2.png differ diff --git a/docs/games/Bait/img/Bait-level-Block2D-3.png b/docs/games/Bait/img/Bait-level-Block2D-3.png index 8e719517e..d3bab6e32 100644 Binary files a/docs/games/Bait/img/Bait-level-Block2D-3.png and b/docs/games/Bait/img/Bait-level-Block2D-3.png differ diff --git a/docs/games/Bait/img/Bait-level-Block2D-4.png b/docs/games/Bait/img/Bait-level-Block2D-4.png index 3fa965f4a..3d7eeee55 100644 Binary files a/docs/games/Bait/img/Bait-level-Block2D-4.png and b/docs/games/Bait/img/Bait-level-Block2D-4.png differ diff --git a/docs/games/Bait/img/Bait-tile-wall-Block2D.png b/docs/games/Bait/img/Bait-tile-wall-Block2D.png index 4f86370cb..68f2f8c15 100644 Binary files a/docs/games/Bait/img/Bait-tile-wall-Block2D.png and b/docs/games/Bait/img/Bait-tile-wall-Block2D.png differ diff --git a/docs/games/Bait_With_Keys/img/Bait_With_Keys-level-Block2D-0.png b/docs/games/Bait_With_Keys/img/Bait_With_Keys-level-Block2D-0.png index 09434b604..6a9687a6c 100644 Binary files a/docs/games/Bait_With_Keys/img/Bait_With_Keys-level-Block2D-0.png and b/docs/games/Bait_With_Keys/img/Bait_With_Keys-level-Block2D-0.png differ diff --git a/docs/games/Bait_With_Keys/img/Bait_With_Keys-level-Block2D-1.png b/docs/games/Bait_With_Keys/img/Bait_With_Keys-level-Block2D-1.png index 26fb4a873..9dfa12cf3 100644 Binary files a/docs/games/Bait_With_Keys/img/Bait_With_Keys-level-Block2D-1.png and b/docs/games/Bait_With_Keys/img/Bait_With_Keys-level-Block2D-1.png differ diff --git a/docs/games/Bait_With_Keys/img/Bait_With_Keys-level-Block2D-2.png b/docs/games/Bait_With_Keys/img/Bait_With_Keys-level-Block2D-2.png index bd2110cf0..73d1d14a9 100644 Binary files a/docs/games/Bait_With_Keys/img/Bait_With_Keys-level-Block2D-2.png and b/docs/games/Bait_With_Keys/img/Bait_With_Keys-level-Block2D-2.png differ diff --git a/docs/games/Bait_With_Keys/img/Bait_With_Keys-level-Block2D-3.png b/docs/games/Bait_With_Keys/img/Bait_With_Keys-level-Block2D-3.png index 8e719517e..d3bab6e32 100644 Binary files a/docs/games/Bait_With_Keys/img/Bait_With_Keys-level-Block2D-3.png and b/docs/games/Bait_With_Keys/img/Bait_With_Keys-level-Block2D-3.png differ diff --git a/docs/games/Bait_With_Keys/img/Bait_With_Keys-level-Block2D-4.png b/docs/games/Bait_With_Keys/img/Bait_With_Keys-level-Block2D-4.png index 3fa965f4a..3d7eeee55 100644 Binary files a/docs/games/Bait_With_Keys/img/Bait_With_Keys-level-Block2D-4.png and b/docs/games/Bait_With_Keys/img/Bait_With_Keys-level-Block2D-4.png differ diff --git a/docs/games/Bait_With_Keys/img/Bait_With_Keys-tile-wall-Block2D.png b/docs/games/Bait_With_Keys/img/Bait_With_Keys-tile-wall-Block2D.png index 4f86370cb..68f2f8c15 100644 Binary files a/docs/games/Bait_With_Keys/img/Bait_With_Keys-tile-wall-Block2D.png and b/docs/games/Bait_With_Keys/img/Bait_With_Keys-tile-wall-Block2D.png differ diff --git a/docs/games/Clusters/img/Clusters-level-Block2D-0.png b/docs/games/Clusters/img/Clusters-level-Block2D-0.png index e1397764c..826b19fb3 100644 Binary files a/docs/games/Clusters/img/Clusters-level-Block2D-0.png and b/docs/games/Clusters/img/Clusters-level-Block2D-0.png differ diff --git a/docs/games/Clusters/img/Clusters-level-Block2D-1.png b/docs/games/Clusters/img/Clusters-level-Block2D-1.png index 41bd46207..b2af26802 100644 Binary files a/docs/games/Clusters/img/Clusters-level-Block2D-1.png and b/docs/games/Clusters/img/Clusters-level-Block2D-1.png differ diff --git a/docs/games/Clusters/img/Clusters-level-Block2D-2.png b/docs/games/Clusters/img/Clusters-level-Block2D-2.png index 9fd2369b0..425e8e8cf 100644 Binary files a/docs/games/Clusters/img/Clusters-level-Block2D-2.png and b/docs/games/Clusters/img/Clusters-level-Block2D-2.png differ diff --git a/docs/games/Clusters/img/Clusters-level-Block2D-3.png b/docs/games/Clusters/img/Clusters-level-Block2D-3.png index 38f3c0161..c54c511f7 100644 Binary files a/docs/games/Clusters/img/Clusters-level-Block2D-3.png and b/docs/games/Clusters/img/Clusters-level-Block2D-3.png differ diff --git a/docs/games/Clusters/img/Clusters-level-Block2D-4.png b/docs/games/Clusters/img/Clusters-level-Block2D-4.png index 086c769d5..4c207af05 100644 Binary files a/docs/games/Clusters/img/Clusters-level-Block2D-4.png and b/docs/games/Clusters/img/Clusters-level-Block2D-4.png differ diff --git a/docs/games/Clusters/img/Clusters-tile-blue_box-Block2D.png b/docs/games/Clusters/img/Clusters-tile-blue_box-Block2D.png index c5b783f2e..a3e5e7dcb 100644 Binary files a/docs/games/Clusters/img/Clusters-tile-blue_box-Block2D.png and b/docs/games/Clusters/img/Clusters-tile-blue_box-Block2D.png differ diff --git a/docs/games/Clusters/img/Clusters-tile-green_box-Block2D.png b/docs/games/Clusters/img/Clusters-tile-green_box-Block2D.png index 03bbf5270..f4d4ed5ef 100644 Binary files a/docs/games/Clusters/img/Clusters-tile-green_box-Block2D.png and b/docs/games/Clusters/img/Clusters-tile-green_box-Block2D.png differ diff --git a/docs/games/Clusters/img/Clusters-tile-red_box-Block2D.png b/docs/games/Clusters/img/Clusters-tile-red_box-Block2D.png index 9b03b1571..f289ba7c9 100644 Binary files a/docs/games/Clusters/img/Clusters-tile-red_box-Block2D.png and b/docs/games/Clusters/img/Clusters-tile-red_box-Block2D.png differ diff --git a/docs/games/Clusters/img/Clusters-tile-wall-Block2D.png b/docs/games/Clusters/img/Clusters-tile-wall-Block2D.png index 4f86370cb..68f2f8c15 100644 Binary files a/docs/games/Clusters/img/Clusters-tile-wall-Block2D.png and b/docs/games/Clusters/img/Clusters-tile-wall-Block2D.png differ diff --git a/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-level-Sprite2D-2.png b/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-level-Sprite2D-2.png index 573d02fe3..f3464f673 100644 Binary files a/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-level-Sprite2D-2.png and b/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-level-Sprite2D-2.png differ diff --git a/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-level-Sprite2D-3.png b/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-level-Sprite2D-3.png index 4472f05d5..f7584150b 100644 Binary files a/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-level-Sprite2D-3.png and b/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-level-Sprite2D-3.png differ diff --git a/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-level-Sprite2D-4.png b/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-level-Sprite2D-4.png index bf84e2527..130fff973 100644 Binary files a/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-level-Sprite2D-4.png and b/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-level-Sprite2D-4.png differ diff --git a/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-level-Sprite2D-5.png b/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-level-Sprite2D-5.png index b97ca4ff6..16500dd79 100644 Binary files a/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-level-Sprite2D-5.png and b/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-level-Sprite2D-5.png differ diff --git a/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-tile-key-Sprite2D.png b/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-tile-key-Sprite2D.png index af95f3e10..c0761c930 100644 Binary files a/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-tile-key-Sprite2D.png and b/docs/games/Cook_Me_Pasta/img/Cook_Me_Pasta-tile-key-Sprite2D.png differ diff --git a/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-level-Block2D-0.png b/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-level-Block2D-0.png index c0fae810f..c35bc0943 100644 Binary files a/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-level-Block2D-0.png and b/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-level-Block2D-0.png differ diff --git a/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-level-Block2D-1.png b/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-level-Block2D-1.png index 9ebeaabd9..6228cc49b 100644 Binary files a/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-level-Block2D-1.png and b/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-level-Block2D-1.png differ diff --git a/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-level-Block2D-2.png b/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-level-Block2D-2.png index d7bc87477..bdf196159 100644 Binary files a/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-level-Block2D-2.png and b/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-level-Block2D-2.png differ diff --git a/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-level-Block2D-3.png b/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-level-Block2D-3.png index 11dfe9b6c..dd7cc19b4 100644 Binary files a/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-level-Block2D-3.png and b/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-level-Block2D-3.png differ diff --git a/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-level-Block2D-4.png b/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-level-Block2D-4.png index 717dfa017..5b85f84b2 100644 Binary files a/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-level-Block2D-4.png and b/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-level-Block2D-4.png differ diff --git a/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-tile-door-Block2D.png b/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-tile-door-Block2D.png index 400a886ed..1e2e81af6 100644 Binary files a/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-tile-door-Block2D.png and b/docs/games/Drunk_Dwarf/img/Drunk_Dwarf-tile-door-Block2D.png differ diff --git a/docs/games/Foragers/img/Foragers-level-Block2D-0.png b/docs/games/Foragers/img/Foragers-level-Block2D-0.png index 77bb56c59..bb2bd5238 100644 Binary files a/docs/games/Foragers/img/Foragers-level-Block2D-0.png and b/docs/games/Foragers/img/Foragers-level-Block2D-0.png differ diff --git a/docs/games/Foragers/img/Foragers-level-Block2D-1.png b/docs/games/Foragers/img/Foragers-level-Block2D-1.png index 48f898861..33aecf3e8 100644 Binary files a/docs/games/Foragers/img/Foragers-level-Block2D-1.png and b/docs/games/Foragers/img/Foragers-level-Block2D-1.png differ diff --git a/docs/games/Foragers/img/Foragers-level-Block2D-2.png b/docs/games/Foragers/img/Foragers-level-Block2D-2.png index f53693452..6aded34b5 100644 Binary files a/docs/games/Foragers/img/Foragers-level-Block2D-2.png and b/docs/games/Foragers/img/Foragers-level-Block2D-2.png differ diff --git a/docs/games/Foragers/img/Foragers-level-Sprite2D-0.png b/docs/games/Foragers/img/Foragers-level-Sprite2D-0.png index 35abd40d7..5061a126d 100644 Binary files a/docs/games/Foragers/img/Foragers-level-Sprite2D-0.png and b/docs/games/Foragers/img/Foragers-level-Sprite2D-0.png differ diff --git a/docs/games/Foragers/img/Foragers-level-Sprite2D-1.png b/docs/games/Foragers/img/Foragers-level-Sprite2D-1.png index 52ae70f77..b35999a85 100644 Binary files a/docs/games/Foragers/img/Foragers-level-Sprite2D-1.png and b/docs/games/Foragers/img/Foragers-level-Sprite2D-1.png differ diff --git a/docs/games/Foragers/img/Foragers-level-Sprite2D-2.png b/docs/games/Foragers/img/Foragers-level-Sprite2D-2.png index 730209ea3..3e700aff3 100644 Binary files a/docs/games/Foragers/img/Foragers-level-Sprite2D-2.png and b/docs/games/Foragers/img/Foragers-level-Sprite2D-2.png differ diff --git a/docs/games/Foragers/img/Foragers-tile-fixed_wall-Block2D.png b/docs/games/Foragers/img/Foragers-tile-fixed_wall-Block2D.png index c28411a13..23b17524e 100644 Binary files a/docs/games/Foragers/img/Foragers-tile-fixed_wall-Block2D.png and b/docs/games/Foragers/img/Foragers-tile-fixed_wall-Block2D.png differ diff --git a/docs/games/Foragers/img/Foragers-tile-potion1-Sprite2D.png b/docs/games/Foragers/img/Foragers-tile-potion1-Sprite2D.png index 624648871..e4ff05412 100644 Binary files a/docs/games/Foragers/img/Foragers-tile-potion1-Sprite2D.png and b/docs/games/Foragers/img/Foragers-tile-potion1-Sprite2D.png differ diff --git a/docs/games/Foragers/img/Foragers-tile-potion2-Sprite2D.png b/docs/games/Foragers/img/Foragers-tile-potion2-Sprite2D.png index 8ae9af01f..352bfdbd0 100644 Binary files a/docs/games/Foragers/img/Foragers-tile-potion2-Sprite2D.png and b/docs/games/Foragers/img/Foragers-tile-potion2-Sprite2D.png differ diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Block2D-1.png b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Block2D-1.png index 7511066af..8b44718d2 100644 Binary files a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Block2D-1.png and b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Block2D-1.png differ diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Block2D-2.png b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Block2D-2.png index 8fde77d1b..a8baabe97 100644 Binary files a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Block2D-2.png and b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Block2D-2.png differ diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Block2D-3.png b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Block2D-3.png index 7d91d043f..08a2687c9 100644 Binary files a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Block2D-3.png and b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Block2D-3.png differ diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Isometric-0.png b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Isometric-0.png index acaff02b9..5ca7db4c5 100644 Binary files a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Isometric-0.png and b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Isometric-0.png differ diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Isometric-1.png b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Isometric-1.png index 154d9e2cf..2f2c88437 100644 Binary files a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Isometric-1.png and b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Isometric-1.png differ diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Isometric-2.png b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Isometric-2.png index 38c068baf..3a5550e10 100644 Binary files a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Isometric-2.png and b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Isometric-2.png differ diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Isometric-3.png b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Isometric-3.png index bda33ba00..906779827 100644 Binary files a/docs/games/GriddlyRTS/img/GriddlyRTS-level-Isometric-3.png and b/docs/games/GriddlyRTS/img/GriddlyRTS-level-Isometric-3.png differ diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-fixed_wall-Block2D.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-fixed_wall-Block2D.png index c28411a13..23b17524e 100644 Binary files a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-fixed_wall-Block2D.png and b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-fixed_wall-Block2D.png differ diff --git a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-worker-Isometric.png b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-worker-Isometric.png index 58ffffafc..225640b30 100644 Binary files a/docs/games/GriddlyRTS/img/GriddlyRTS-tile-worker-Isometric.png and b/docs/games/GriddlyRTS/img/GriddlyRTS-tile-worker-Isometric.png differ diff --git a/docs/games/Heal_Or_Die/img/Heal_Or_Die-level-Block2D-0.png b/docs/games/Heal_Or_Die/img/Heal_Or_Die-level-Block2D-0.png index dba0dcd64..ca73ff3a6 100644 Binary files a/docs/games/Heal_Or_Die/img/Heal_Or_Die-level-Block2D-0.png and b/docs/games/Heal_Or_Die/img/Heal_Or_Die-level-Block2D-0.png differ diff --git a/docs/games/Heal_Or_Die/img/Heal_Or_Die-level-Block2D-1.png b/docs/games/Heal_Or_Die/img/Heal_Or_Die-level-Block2D-1.png index db0606562..39c97c4de 100644 Binary files a/docs/games/Heal_Or_Die/img/Heal_Or_Die-level-Block2D-1.png and b/docs/games/Heal_Or_Die/img/Heal_Or_Die-level-Block2D-1.png differ diff --git a/docs/games/Heal_Or_Die/img/Heal_Or_Die-level-Isometric-0.png b/docs/games/Heal_Or_Die/img/Heal_Or_Die-level-Isometric-0.png index 1d55b694c..34abecfcd 100644 Binary files a/docs/games/Heal_Or_Die/img/Heal_Or_Die-level-Isometric-0.png and b/docs/games/Heal_Or_Die/img/Heal_Or_Die-level-Isometric-0.png differ diff --git a/docs/games/Heal_Or_Die/img/Heal_Or_Die-level-Isometric-1.png b/docs/games/Heal_Or_Die/img/Heal_Or_Die-level-Isometric-1.png index ba2eb78fa..5785c55fb 100644 Binary files a/docs/games/Heal_Or_Die/img/Heal_Or_Die-level-Isometric-1.png and b/docs/games/Heal_Or_Die/img/Heal_Or_Die-level-Isometric-1.png differ diff --git a/docs/games/Heal_Or_Die/img/Heal_Or_Die-tile-healer-Isometric.png b/docs/games/Heal_Or_Die/img/Heal_Or_Die-tile-healer-Isometric.png index 40f3e3ada..408c2735b 100644 Binary files a/docs/games/Heal_Or_Die/img/Heal_Or_Die-tile-healer-Isometric.png and b/docs/games/Heal_Or_Die/img/Heal_Or_Die-tile-healer-Isometric.png differ diff --git a/docs/games/Heal_Or_Die/img/Heal_Or_Die-tile-hole-Isometric.png b/docs/games/Heal_Or_Die/img/Heal_Or_Die-tile-hole-Isometric.png index e717258f7..fd78293bd 100644 Binary files a/docs/games/Heal_Or_Die/img/Heal_Or_Die-tile-hole-Isometric.png and b/docs/games/Heal_Or_Die/img/Heal_Or_Die-tile-hole-Isometric.png differ diff --git a/docs/games/Heal_Or_Die/img/Heal_Or_Die-tile-mountain-Block2D.png b/docs/games/Heal_Or_Die/img/Heal_Or_Die-tile-mountain-Block2D.png index 2466e1167..36c91ba66 100644 Binary files a/docs/games/Heal_Or_Die/img/Heal_Or_Die-tile-mountain-Block2D.png and b/docs/games/Heal_Or_Die/img/Heal_Or_Die-tile-mountain-Block2D.png differ diff --git a/docs/games/Heal_Or_Die/img/Heal_Or_Die-tile-mountain-Isometric.png b/docs/games/Heal_Or_Die/img/Heal_Or_Die-tile-mountain-Isometric.png index 5e4de9341..1badedbff 100644 Binary files a/docs/games/Heal_Or_Die/img/Heal_Or_Die-tile-mountain-Isometric.png and b/docs/games/Heal_Or_Die/img/Heal_Or_Die-tile-mountain-Isometric.png differ diff --git a/docs/games/Heal_Or_Die/img/Heal_Or_Die-tile-warrior-Isometric.png b/docs/games/Heal_Or_Die/img/Heal_Or_Die-tile-warrior-Isometric.png index 14dcc567e..20516e806 100644 Binary files a/docs/games/Heal_Or_Die/img/Heal_Or_Die-tile-warrior-Isometric.png and b/docs/games/Heal_Or_Die/img/Heal_Or_Die-tile-warrior-Isometric.png differ diff --git a/docs/games/Kill_The_King/img/Kill_The_King-level-Block2D-0.png b/docs/games/Kill_The_King/img/Kill_The_King-level-Block2D-0.png index 707f799a3..1ddeee9e3 100644 Binary files a/docs/games/Kill_The_King/img/Kill_The_King-level-Block2D-0.png and b/docs/games/Kill_The_King/img/Kill_The_King-level-Block2D-0.png differ diff --git a/docs/games/Kill_The_King/img/Kill_The_King-level-Isometric-0.png b/docs/games/Kill_The_King/img/Kill_The_King-level-Isometric-0.png index 720b431ba..654378d2d 100644 Binary files a/docs/games/Kill_The_King/img/Kill_The_King-level-Isometric-0.png and b/docs/games/Kill_The_King/img/Kill_The_King-level-Isometric-0.png differ diff --git a/docs/games/Kill_The_King/img/Kill_The_King-tile-archer-Isometric.png b/docs/games/Kill_The_King/img/Kill_The_King-tile-archer-Isometric.png index f6d15b694..e18564c2d 100644 Binary files a/docs/games/Kill_The_King/img/Kill_The_King-tile-archer-Isometric.png and b/docs/games/Kill_The_King/img/Kill_The_King-tile-archer-Isometric.png differ diff --git a/docs/games/Kill_The_King/img/Kill_The_King-tile-forest-Isometric.png b/docs/games/Kill_The_King/img/Kill_The_King-tile-forest-Isometric.png index d5245edf6..00bbdfc64 100644 Binary files a/docs/games/Kill_The_King/img/Kill_The_King-tile-forest-Isometric.png and b/docs/games/Kill_The_King/img/Kill_The_King-tile-forest-Isometric.png differ diff --git a/docs/games/Kill_The_King/img/Kill_The_King-tile-healer-Isometric.png b/docs/games/Kill_The_King/img/Kill_The_King-tile-healer-Isometric.png index 40f3e3ada..408c2735b 100644 Binary files a/docs/games/Kill_The_King/img/Kill_The_King-tile-healer-Isometric.png and b/docs/games/Kill_The_King/img/Kill_The_King-tile-healer-Isometric.png differ diff --git a/docs/games/Kill_The_King/img/Kill_The_King-tile-hole-Isometric.png b/docs/games/Kill_The_King/img/Kill_The_King-tile-hole-Isometric.png index e717258f7..fd78293bd 100644 Binary files a/docs/games/Kill_The_King/img/Kill_The_King-tile-hole-Isometric.png and b/docs/games/Kill_The_King/img/Kill_The_King-tile-hole-Isometric.png differ diff --git a/docs/games/Kill_The_King/img/Kill_The_King-tile-king-Isometric.png b/docs/games/Kill_The_King/img/Kill_The_King-tile-king-Isometric.png index 635809f28..0a7621eab 100644 Binary files a/docs/games/Kill_The_King/img/Kill_The_King-tile-king-Isometric.png and b/docs/games/Kill_The_King/img/Kill_The_King-tile-king-Isometric.png differ diff --git a/docs/games/Kill_The_King/img/Kill_The_King-tile-mountain-Block2D.png b/docs/games/Kill_The_King/img/Kill_The_King-tile-mountain-Block2D.png index 2466e1167..36c91ba66 100644 Binary files a/docs/games/Kill_The_King/img/Kill_The_King-tile-mountain-Block2D.png and b/docs/games/Kill_The_King/img/Kill_The_King-tile-mountain-Block2D.png differ diff --git a/docs/games/Kill_The_King/img/Kill_The_King-tile-mountain-Isometric.png b/docs/games/Kill_The_King/img/Kill_The_King-tile-mountain-Isometric.png index 5e4de9341..1badedbff 100644 Binary files a/docs/games/Kill_The_King/img/Kill_The_King-tile-mountain-Isometric.png and b/docs/games/Kill_The_King/img/Kill_The_King-tile-mountain-Isometric.png differ diff --git a/docs/games/Kill_The_King/img/Kill_The_King-tile-warrior-Isometric.png b/docs/games/Kill_The_King/img/Kill_The_King-tile-warrior-Isometric.png index 14dcc567e..20516e806 100644 Binary files a/docs/games/Kill_The_King/img/Kill_The_King-tile-warrior-Isometric.png and b/docs/games/Kill_The_King/img/Kill_The_King-tile-warrior-Isometric.png differ diff --git a/docs/games/Kill_The_King/img/Kill_The_King-tile-water-Isometric.png b/docs/games/Kill_The_King/img/Kill_The_King-tile-water-Isometric.png index 64f362f6f..4f68717f6 100644 Binary files a/docs/games/Kill_The_King/img/Kill_The_King-tile-water-Isometric.png and b/docs/games/Kill_The_King/img/Kill_The_King-tile-water-Isometric.png differ diff --git a/docs/games/Labyrinth/img/Labyrinth-level-Block2D-0.png b/docs/games/Labyrinth/img/Labyrinth-level-Block2D-0.png index 9c8310def..97219bd79 100644 Binary files a/docs/games/Labyrinth/img/Labyrinth-level-Block2D-0.png and b/docs/games/Labyrinth/img/Labyrinth-level-Block2D-0.png differ diff --git a/docs/games/Labyrinth/img/Labyrinth-level-Block2D-1.png b/docs/games/Labyrinth/img/Labyrinth-level-Block2D-1.png index 0d567e465..b30b59e8f 100644 Binary files a/docs/games/Labyrinth/img/Labyrinth-level-Block2D-1.png and b/docs/games/Labyrinth/img/Labyrinth-level-Block2D-1.png differ diff --git a/docs/games/Labyrinth/img/Labyrinth-level-Block2D-2.png b/docs/games/Labyrinth/img/Labyrinth-level-Block2D-2.png index 2a2edd83b..f2758d5b8 100644 Binary files a/docs/games/Labyrinth/img/Labyrinth-level-Block2D-2.png and b/docs/games/Labyrinth/img/Labyrinth-level-Block2D-2.png differ diff --git a/docs/games/Labyrinth/img/Labyrinth-level-Block2D-3.png b/docs/games/Labyrinth/img/Labyrinth-level-Block2D-3.png index c73ef03a2..d0cc64aff 100644 Binary files a/docs/games/Labyrinth/img/Labyrinth-level-Block2D-3.png and b/docs/games/Labyrinth/img/Labyrinth-level-Block2D-3.png differ diff --git a/docs/games/Labyrinth/img/Labyrinth-level-Block2D-4.png b/docs/games/Labyrinth/img/Labyrinth-level-Block2D-4.png index e84ff36b7..b7d342de9 100644 Binary files a/docs/games/Labyrinth/img/Labyrinth-level-Block2D-4.png and b/docs/games/Labyrinth/img/Labyrinth-level-Block2D-4.png differ diff --git a/docs/games/Labyrinth/img/Labyrinth-tile-wall-Block2D.png b/docs/games/Labyrinth/img/Labyrinth-tile-wall-Block2D.png index 4f86370cb..68f2f8c15 100644 Binary files a/docs/games/Labyrinth/img/Labyrinth-tile-wall-Block2D.png and b/docs/games/Labyrinth/img/Labyrinth-tile-wall-Block2D.png differ diff --git a/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-level-Block2D-0.png b/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-level-Block2D-0.png index 09434b604..6a9687a6c 100644 Binary files a/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-level-Block2D-0.png and b/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-level-Block2D-0.png differ diff --git a/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-level-Block2D-1.png b/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-level-Block2D-1.png index 26fb4a873..9dfa12cf3 100644 Binary files a/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-level-Block2D-1.png and b/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-level-Block2D-1.png differ diff --git a/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-level-Block2D-2.png b/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-level-Block2D-2.png index bd2110cf0..73d1d14a9 100644 Binary files a/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-level-Block2D-2.png and b/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-level-Block2D-2.png differ diff --git a/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-level-Block2D-3.png b/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-level-Block2D-3.png index 8e719517e..d3bab6e32 100644 Binary files a/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-level-Block2D-3.png and b/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-level-Block2D-3.png differ diff --git a/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-level-Block2D-4.png b/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-level-Block2D-4.png index 3fa965f4a..3d7eeee55 100644 Binary files a/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-level-Block2D-4.png and b/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-level-Block2D-4.png differ diff --git a/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-tile-wall-Block2D.png b/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-tile-wall-Block2D.png index 4f86370cb..68f2f8c15 100644 Binary files a/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-tile-wall-Block2D.png and b/docs/games/Partially_Observable_Bait/img/Partially_Observable_Bait-tile-wall-Block2D.png differ diff --git a/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-level-Block2D-0.png b/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-level-Block2D-0.png index e1397764c..826b19fb3 100644 Binary files a/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-level-Block2D-0.png and b/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-level-Block2D-0.png differ diff --git a/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-level-Block2D-1.png b/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-level-Block2D-1.png index 41bd46207..b2af26802 100644 Binary files a/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-level-Block2D-1.png and b/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-level-Block2D-1.png differ diff --git a/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-level-Block2D-2.png b/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-level-Block2D-2.png index 9fd2369b0..425e8e8cf 100644 Binary files a/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-level-Block2D-2.png and b/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-level-Block2D-2.png differ diff --git a/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-level-Block2D-3.png b/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-level-Block2D-3.png index 38f3c0161..c54c511f7 100644 Binary files a/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-level-Block2D-3.png and b/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-level-Block2D-3.png differ diff --git a/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-level-Block2D-4.png b/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-level-Block2D-4.png index 086c769d5..4c207af05 100644 Binary files a/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-level-Block2D-4.png and b/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-level-Block2D-4.png differ diff --git a/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-tile-blue_box-Block2D.png b/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-tile-blue_box-Block2D.png index c5b783f2e..a3e5e7dcb 100644 Binary files a/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-tile-blue_box-Block2D.png and b/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-tile-blue_box-Block2D.png differ diff --git a/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-tile-green_box-Block2D.png b/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-tile-green_box-Block2D.png index 03bbf5270..f4d4ed5ef 100644 Binary files a/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-tile-green_box-Block2D.png and b/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-tile-green_box-Block2D.png differ diff --git a/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-tile-red_box-Block2D.png b/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-tile-red_box-Block2D.png index 9b03b1571..f289ba7c9 100644 Binary files a/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-tile-red_box-Block2D.png and b/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-tile-red_box-Block2D.png differ diff --git a/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-tile-wall-Block2D.png b/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-tile-wall-Block2D.png index 4f86370cb..68f2f8c15 100644 Binary files a/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-tile-wall-Block2D.png and b/docs/games/Partially_Observable_Clusters/img/Partially_Observable_Clusters-tile-wall-Block2D.png differ diff --git a/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-level-Sprite2D-2.png b/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-level-Sprite2D-2.png index 573d02fe3..f3464f673 100644 Binary files a/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-level-Sprite2D-2.png and b/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-level-Sprite2D-2.png differ diff --git a/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-level-Sprite2D-3.png b/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-level-Sprite2D-3.png index 4472f05d5..f7584150b 100644 Binary files a/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-level-Sprite2D-3.png and b/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-level-Sprite2D-3.png differ diff --git a/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-level-Sprite2D-4.png b/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-level-Sprite2D-4.png index bf84e2527..130fff973 100644 Binary files a/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-level-Sprite2D-4.png and b/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-level-Sprite2D-4.png differ diff --git a/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-level-Sprite2D-5.png b/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-level-Sprite2D-5.png index b97ca4ff6..16500dd79 100644 Binary files a/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-level-Sprite2D-5.png and b/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-level-Sprite2D-5.png differ diff --git a/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-tile-key-Sprite2D.png b/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-tile-key-Sprite2D.png index af95f3e10..c0761c930 100644 Binary files a/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-tile-key-Sprite2D.png and b/docs/games/Partially_Observable_Cook_Me_Pasta/img/Partially_Observable_Cook_Me_Pasta-tile-key-Sprite2D.png differ diff --git a/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-level-Block2D-0.png b/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-level-Block2D-0.png index 9c8310def..97219bd79 100644 Binary files a/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-level-Block2D-0.png and b/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-level-Block2D-0.png differ diff --git a/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-level-Block2D-1.png b/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-level-Block2D-1.png index 0d567e465..b30b59e8f 100644 Binary files a/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-level-Block2D-1.png and b/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-level-Block2D-1.png differ diff --git a/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-level-Block2D-2.png b/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-level-Block2D-2.png index 2a2edd83b..f2758d5b8 100644 Binary files a/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-level-Block2D-2.png and b/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-level-Block2D-2.png differ diff --git a/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-level-Block2D-3.png b/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-level-Block2D-3.png index c73ef03a2..d0cc64aff 100644 Binary files a/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-level-Block2D-3.png and b/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-level-Block2D-3.png differ diff --git a/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-level-Block2D-4.png b/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-level-Block2D-4.png index e84ff36b7..b7d342de9 100644 Binary files a/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-level-Block2D-4.png and b/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-level-Block2D-4.png differ diff --git a/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-tile-wall-Block2D.png b/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-tile-wall-Block2D.png index 4f86370cb..68f2f8c15 100644 Binary files a/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-tile-wall-Block2D.png and b/docs/games/Partially_Observable_Labyrinth/img/Partially_Observable_Labyrinth-tile-wall-Block2D.png differ diff --git a/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-level-Block2D-0.png b/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-level-Block2D-0.png index 7c21a464c..9ce3e2c03 100644 Binary files a/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-level-Block2D-0.png and b/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-level-Block2D-0.png differ diff --git a/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-level-Block2D-1.png b/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-level-Block2D-1.png index 529a4d588..0e0d2779e 100644 Binary files a/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-level-Block2D-1.png and b/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-level-Block2D-1.png differ diff --git a/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-level-Block2D-2.png b/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-level-Block2D-2.png index 5dcb04167..08b80407c 100644 Binary files a/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-level-Block2D-2.png and b/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-level-Block2D-2.png differ diff --git a/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-level-Sprite2D-0.png b/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-level-Sprite2D-0.png index 01f93dcbc..335547d1c 100644 Binary files a/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-level-Sprite2D-0.png and b/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-level-Sprite2D-0.png differ diff --git a/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-level-Sprite2D-1.png b/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-level-Sprite2D-1.png index efbc6ecc2..ae3e181e3 100644 Binary files a/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-level-Sprite2D-1.png and b/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-level-Sprite2D-1.png differ diff --git a/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-level-Sprite2D-2.png b/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-level-Sprite2D-2.png index d20cd254a..94fb66b95 100644 Binary files a/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-level-Sprite2D-2.png and b/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-level-Sprite2D-2.png differ diff --git a/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-tile-avatar-Block2D.png b/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-tile-avatar-Block2D.png index 30bc651c6..0e34ebaef 100644 Binary files a/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-tile-avatar-Block2D.png and b/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-tile-avatar-Block2D.png differ diff --git a/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-tile-key-Block2D.png b/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-tile-key-Block2D.png index 8abe69a3d..511aa028e 100644 Binary files a/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-tile-key-Block2D.png and b/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-tile-key-Block2D.png differ diff --git a/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-tile-key-Sprite2D.png b/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-tile-key-Sprite2D.png index e976c2768..cb457e470 100644 Binary files a/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-tile-key-Sprite2D.png and b/docs/games/Partially_Observable_Zelda/img/Partially_Observable_Zelda-tile-key-Sprite2D.png differ diff --git a/docs/games/Push_Mania/img/Push_Mania-level-Isometric-0.png b/docs/games/Push_Mania/img/Push_Mania-level-Isometric-0.png index baf7f3675..5f0b8c1db 100644 Binary files a/docs/games/Push_Mania/img/Push_Mania-level-Isometric-0.png and b/docs/games/Push_Mania/img/Push_Mania-level-Isometric-0.png differ diff --git a/docs/games/Push_Mania/img/Push_Mania-level-Isometric-1.png b/docs/games/Push_Mania/img/Push_Mania-level-Isometric-1.png index 44d364f3e..6b1d74837 100644 Binary files a/docs/games/Push_Mania/img/Push_Mania-level-Isometric-1.png and b/docs/games/Push_Mania/img/Push_Mania-level-Isometric-1.png differ diff --git a/docs/games/Push_Mania/img/Push_Mania-tile-hole-Isometric.png b/docs/games/Push_Mania/img/Push_Mania-tile-hole-Isometric.png index 690d59f63..c65272e2e 100644 Binary files a/docs/games/Push_Mania/img/Push_Mania-tile-hole-Isometric.png and b/docs/games/Push_Mania/img/Push_Mania-tile-hole-Isometric.png differ diff --git a/docs/games/Push_Mania/img/Push_Mania-tile-pusher-Isometric.png b/docs/games/Push_Mania/img/Push_Mania-tile-pusher-Isometric.png index 40f3e3ada..408c2735b 100644 Binary files a/docs/games/Push_Mania/img/Push_Mania-tile-pusher-Isometric.png and b/docs/games/Push_Mania/img/Push_Mania-tile-pusher-Isometric.png differ diff --git a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Block2D-0.png b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Block2D-0.png index abd640799..26e6e470a 100644 Binary files a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Block2D-0.png and b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Block2D-0.png differ diff --git a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Block2D-1.png b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Block2D-1.png index f4a73eddc..3412d56be 100644 Binary files a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Block2D-1.png and b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Block2D-1.png differ diff --git a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Block2D-2.png b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Block2D-2.png index e74d469aa..6bfef0cac 100644 Binary files a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Block2D-2.png and b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Block2D-2.png differ diff --git a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Block2D-3.png b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Block2D-3.png index ac90b5010..187bc7fdf 100644 Binary files a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Block2D-3.png and b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Block2D-3.png differ diff --git a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Sprite2D-0.png b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Sprite2D-0.png index 258e15878..dab6f0806 100644 Binary files a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Sprite2D-0.png and b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Sprite2D-0.png differ diff --git a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Sprite2D-1.png b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Sprite2D-1.png index a8b413f95..e43b91a99 100644 Binary files a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Sprite2D-1.png and b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Sprite2D-1.png differ diff --git a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Sprite2D-2.png b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Sprite2D-2.png index 34a07720b..4e16ca6fe 100644 Binary files a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Sprite2D-2.png and b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Sprite2D-2.png differ diff --git a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Sprite2D-3.png b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Sprite2D-3.png index 6e7ef3f37..fa3426c08 100644 Binary files a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Sprite2D-3.png and b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-level-Sprite2D-3.png differ diff --git a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-tile-fixed_wall-Block2D.png b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-tile-fixed_wall-Block2D.png index c28411a13..23b17524e 100644 Binary files a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-tile-fixed_wall-Block2D.png and b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-tile-fixed_wall-Block2D.png differ diff --git a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-tile-tagger-Sprite2D.png b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-tile-tagger-Sprite2D.png index 1db9c0209..5c1c492c6 100644 Binary files a/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-tile-tagger-Sprite2D.png and b/docs/games/Robot_Tag_12v12/img/Robot_Tag_12v12-tile-tagger-Sprite2D.png differ diff --git a/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Block2D-0.png b/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Block2D-0.png index 415a16ca1..ba53f7ddc 100644 Binary files a/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Block2D-0.png and b/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Block2D-0.png differ diff --git a/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Block2D-1.png b/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Block2D-1.png index 99a91de4b..cc0e50de8 100644 Binary files a/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Block2D-1.png and b/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Block2D-1.png differ diff --git a/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Block2D-2.png b/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Block2D-2.png index aa9086a85..533db2b57 100644 Binary files a/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Block2D-2.png and b/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Block2D-2.png differ diff --git a/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Block2D-3.png b/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Block2D-3.png index 8a8179748..0d55660c0 100644 Binary files a/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Block2D-3.png and b/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Block2D-3.png differ diff --git a/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Sprite2D-0.png b/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Sprite2D-0.png index 003bd0f45..aa190b14c 100644 Binary files a/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Sprite2D-0.png and b/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Sprite2D-0.png differ diff --git a/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Sprite2D-3.png b/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Sprite2D-3.png index 6910e0381..be96b2c87 100644 Binary files a/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Sprite2D-3.png and b/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-level-Sprite2D-3.png differ diff --git a/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-tile-fixed_wall-Block2D.png b/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-tile-fixed_wall-Block2D.png index c28411a13..23b17524e 100644 Binary files a/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-tile-fixed_wall-Block2D.png and b/docs/games/Robot_Tag_4v4/img/Robot_Tag_4v4-tile-fixed_wall-Block2D.png differ diff --git a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Block2D-0.png b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Block2D-0.png index 7d6d494c8..de012c3b1 100644 Binary files a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Block2D-0.png and b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Block2D-0.png differ diff --git a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Block2D-1.png b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Block2D-1.png index 5dec39f48..55b96acb6 100644 Binary files a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Block2D-1.png and b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Block2D-1.png differ diff --git a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Block2D-2.png b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Block2D-2.png index ac8ac6b3e..b439e6038 100644 Binary files a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Block2D-2.png and b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Block2D-2.png differ diff --git a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Block2D-3.png b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Block2D-3.png index 9bbe150e0..c0ea08dd2 100644 Binary files a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Block2D-3.png and b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Block2D-3.png differ diff --git a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Sprite2D-0.png b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Sprite2D-0.png index 6ba372a01..458f4e078 100644 Binary files a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Sprite2D-0.png and b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Sprite2D-0.png differ diff --git a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Sprite2D-1.png b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Sprite2D-1.png index 0457cae4c..e8292f96c 100644 Binary files a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Sprite2D-1.png and b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Sprite2D-1.png differ diff --git a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Sprite2D-2.png b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Sprite2D-2.png index 3f6f844e2..44c3393d3 100644 Binary files a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Sprite2D-2.png and b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Sprite2D-2.png differ diff --git a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Sprite2D-3.png b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Sprite2D-3.png index cd2e98605..73d55deda 100644 Binary files a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Sprite2D-3.png and b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-level-Sprite2D-3.png differ diff --git a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-tile-fixed_wall-Block2D.png b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-tile-fixed_wall-Block2D.png index c28411a13..23b17524e 100644 Binary files a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-tile-fixed_wall-Block2D.png and b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-tile-fixed_wall-Block2D.png differ diff --git a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-tile-tagger-Block2D.png b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-tile-tagger-Block2D.png index 662bfa0ff..4a5495d4b 100644 Binary files a/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-tile-tagger-Block2D.png and b/docs/games/Robot_Tag_8v8/img/Robot_Tag_8v8-tile-tagger-Block2D.png differ diff --git a/docs/games/Zelda/img/Zelda-level-Block2D-0.png b/docs/games/Zelda/img/Zelda-level-Block2D-0.png index 7c21a464c..9ce3e2c03 100644 Binary files a/docs/games/Zelda/img/Zelda-level-Block2D-0.png and b/docs/games/Zelda/img/Zelda-level-Block2D-0.png differ diff --git a/docs/games/Zelda/img/Zelda-level-Block2D-1.png b/docs/games/Zelda/img/Zelda-level-Block2D-1.png index 9bcded680..3ff002988 100644 Binary files a/docs/games/Zelda/img/Zelda-level-Block2D-1.png and b/docs/games/Zelda/img/Zelda-level-Block2D-1.png differ diff --git a/docs/games/Zelda/img/Zelda-level-Block2D-2.png b/docs/games/Zelda/img/Zelda-level-Block2D-2.png index 5dcb04167..08b80407c 100644 Binary files a/docs/games/Zelda/img/Zelda-level-Block2D-2.png and b/docs/games/Zelda/img/Zelda-level-Block2D-2.png differ diff --git a/docs/games/Zelda/img/Zelda-level-Sprite2D-0.png b/docs/games/Zelda/img/Zelda-level-Sprite2D-0.png index 01f93dcbc..335547d1c 100644 Binary files a/docs/games/Zelda/img/Zelda-level-Sprite2D-0.png and b/docs/games/Zelda/img/Zelda-level-Sprite2D-0.png differ diff --git a/docs/games/Zelda/img/Zelda-level-Sprite2D-1.png b/docs/games/Zelda/img/Zelda-level-Sprite2D-1.png index 291c16462..ea6ee5738 100644 Binary files a/docs/games/Zelda/img/Zelda-level-Sprite2D-1.png and b/docs/games/Zelda/img/Zelda-level-Sprite2D-1.png differ diff --git a/docs/games/Zelda/img/Zelda-level-Sprite2D-2.png b/docs/games/Zelda/img/Zelda-level-Sprite2D-2.png index d20cd254a..94fb66b95 100644 Binary files a/docs/games/Zelda/img/Zelda-level-Sprite2D-2.png and b/docs/games/Zelda/img/Zelda-level-Sprite2D-2.png differ diff --git a/docs/games/Zelda/img/Zelda-tile-avatar-Block2D.png b/docs/games/Zelda/img/Zelda-tile-avatar-Block2D.png index 30bc651c6..0e34ebaef 100644 Binary files a/docs/games/Zelda/img/Zelda-tile-avatar-Block2D.png and b/docs/games/Zelda/img/Zelda-tile-avatar-Block2D.png differ diff --git a/docs/games/Zelda/img/Zelda-tile-key-Block2D.png b/docs/games/Zelda/img/Zelda-tile-key-Block2D.png index 8abe69a3d..511aa028e 100644 Binary files a/docs/games/Zelda/img/Zelda-tile-key-Block2D.png and b/docs/games/Zelda/img/Zelda-tile-key-Block2D.png differ diff --git a/docs/games/Zelda/img/Zelda-tile-key-Sprite2D.png b/docs/games/Zelda/img/Zelda-tile-key-Sprite2D.png index e976c2768..cb457e470 100644 Binary files a/docs/games/Zelda/img/Zelda-tile-key-Sprite2D.png and b/docs/games/Zelda/img/Zelda-tile-key-Sprite2D.png differ diff --git a/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Block2D-0.png b/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Block2D-0.png index 7c21a464c..9ce3e2c03 100644 Binary files a/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Block2D-0.png and b/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Block2D-0.png differ diff --git a/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Block2D-1.png b/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Block2D-1.png index 9bcded680..3ff002988 100644 Binary files a/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Block2D-1.png and b/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Block2D-1.png differ diff --git a/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Block2D-2.png b/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Block2D-2.png index 9291edade..98194c60f 100644 Binary files a/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Block2D-2.png and b/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Block2D-2.png differ diff --git a/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Sprite2D-0.png b/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Sprite2D-0.png index 01f93dcbc..335547d1c 100644 Binary files a/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Sprite2D-0.png and b/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Sprite2D-0.png differ diff --git a/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Sprite2D-1.png b/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Sprite2D-1.png index 291c16462..ea6ee5738 100644 Binary files a/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Sprite2D-1.png and b/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Sprite2D-1.png differ diff --git a/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Sprite2D-2.png b/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Sprite2D-2.png index 3389a9f3e..a6c5544d1 100644 Binary files a/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Sprite2D-2.png and b/docs/games/Zelda_Sequential/img/Zelda_Sequential-level-Sprite2D-2.png differ diff --git a/docs/games/Zelda_Sequential/img/Zelda_Sequential-tile-avatar-Block2D.png b/docs/games/Zelda_Sequential/img/Zelda_Sequential-tile-avatar-Block2D.png index 30bc651c6..0e34ebaef 100644 Binary files a/docs/games/Zelda_Sequential/img/Zelda_Sequential-tile-avatar-Block2D.png and b/docs/games/Zelda_Sequential/img/Zelda_Sequential-tile-avatar-Block2D.png differ diff --git a/docs/games/Zelda_Sequential/img/Zelda_Sequential-tile-key-Block2D.png b/docs/games/Zelda_Sequential/img/Zelda_Sequential-tile-key-Block2D.png index 8abe69a3d..511aa028e 100644 Binary files a/docs/games/Zelda_Sequential/img/Zelda_Sequential-tile-key-Block2D.png and b/docs/games/Zelda_Sequential/img/Zelda_Sequential-tile-key-Block2D.png differ diff --git a/docs/games/Zelda_Sequential/img/Zelda_Sequential-tile-key-Sprite2D.png b/docs/games/Zelda_Sequential/img/Zelda_Sequential-tile-key-Sprite2D.png index e976c2768..cb457e470 100644 Binary files a/docs/games/Zelda_Sequential/img/Zelda_Sequential-tile-key-Sprite2D.png and b/docs/games/Zelda_Sequential/img/Zelda_Sequential-tile-key-Sprite2D.png differ diff --git a/docs/games/img/Cook_Me_Pasta-taster.png b/docs/games/img/Cook_Me_Pasta-taster.png index b97ca4ff6..16500dd79 100644 Binary files a/docs/games/img/Cook_Me_Pasta-taster.png and b/docs/games/img/Cook_Me_Pasta-taster.png differ diff --git a/docs/games/img/Foragers-taster.png b/docs/games/img/Foragers-taster.png index 730209ea3..3e700aff3 100644 Binary files a/docs/games/img/Foragers-taster.png and b/docs/games/img/Foragers-taster.png differ diff --git a/docs/games/img/GriddlyRTS-taster.png b/docs/games/img/GriddlyRTS-taster.png index bda33ba00..906779827 100644 Binary files a/docs/games/img/GriddlyRTS-taster.png and b/docs/games/img/GriddlyRTS-taster.png differ diff --git a/docs/games/img/Heal_Or_Die-taster.png b/docs/games/img/Heal_Or_Die-taster.png index ba2eb78fa..5785c55fb 100644 Binary files a/docs/games/img/Heal_Or_Die-taster.png and b/docs/games/img/Heal_Or_Die-taster.png differ diff --git a/docs/games/img/Kill_The_King-taster.png b/docs/games/img/Kill_The_King-taster.png index 720b431ba..654378d2d 100644 Binary files a/docs/games/img/Kill_The_King-taster.png and b/docs/games/img/Kill_The_King-taster.png differ diff --git a/docs/games/img/Partially_Observable_Cook_Me_Pasta-taster.png b/docs/games/img/Partially_Observable_Cook_Me_Pasta-taster.png index b97ca4ff6..16500dd79 100644 Binary files a/docs/games/img/Partially_Observable_Cook_Me_Pasta-taster.png and b/docs/games/img/Partially_Observable_Cook_Me_Pasta-taster.png differ diff --git a/docs/games/img/Partially_Observable_Zelda-taster.png b/docs/games/img/Partially_Observable_Zelda-taster.png index d20cd254a..94fb66b95 100644 Binary files a/docs/games/img/Partially_Observable_Zelda-taster.png and b/docs/games/img/Partially_Observable_Zelda-taster.png differ diff --git a/docs/games/img/Push_Mania-taster.png b/docs/games/img/Push_Mania-taster.png index 44d364f3e..6b1d74837 100644 Binary files a/docs/games/img/Push_Mania-taster.png and b/docs/games/img/Push_Mania-taster.png differ diff --git a/docs/games/img/Robot_Tag_12v12-taster.png b/docs/games/img/Robot_Tag_12v12-taster.png index 6e7ef3f37..fa3426c08 100644 Binary files a/docs/games/img/Robot_Tag_12v12-taster.png and b/docs/games/img/Robot_Tag_12v12-taster.png differ diff --git a/docs/games/img/Robot_Tag_4v4-taster.png b/docs/games/img/Robot_Tag_4v4-taster.png index 6910e0381..be96b2c87 100644 Binary files a/docs/games/img/Robot_Tag_4v4-taster.png and b/docs/games/img/Robot_Tag_4v4-taster.png differ diff --git a/docs/games/img/Robot_Tag_8v8-taster.png b/docs/games/img/Robot_Tag_8v8-taster.png index cd2e98605..73d55deda 100644 Binary files a/docs/games/img/Robot_Tag_8v8-taster.png and b/docs/games/img/Robot_Tag_8v8-taster.png differ diff --git a/docs/games/img/Zelda-taster.png b/docs/games/img/Zelda-taster.png index d20cd254a..94fb66b95 100644 Binary files a/docs/games/img/Zelda-taster.png and b/docs/games/img/Zelda-taster.png differ diff --git a/docs/games/img/Zelda_Sequential-taster.png b/docs/games/img/Zelda_Sequential-taster.png index 3389a9f3e..a6c5544d1 100644 Binary files a/docs/games/img/Zelda_Sequential-taster.png and b/docs/games/img/Zelda_Sequential-taster.png differ diff --git a/docs/games/index.rst b/docs/games/index.rst index 833c11fa1..da26d16ef 100644 --- a/docs/games/index.rst +++ b/docs/games/index.rst @@ -1,59 +1,5 @@ .. _doc_games: -*** -RTS -*** - -.. toctree:: - :hidden: - - GriddlyRTS/index - Push_Mania/index - Heal_Or_Die/index - Kill_The_King/index - -.. list-table:: - :class: game-gallery - - * - **GriddlyRTS** - - .. image:: img/GriddlyRTS-taster.png - :target: GriddlyRTS/index.html - :width: 200 - - An RTS Game. There's aliens and stuff. - - **Push Mania** - - .. image:: img/Push_Mania-taster.png - :target: Push_Mania/index.html - :width: 200 - - Game environment ported from https://github.com/GAIGResearch/Stratega. - You must push all your opponents pieces into the holes. - - - **Heal Or Die** - - .. image:: img/Heal_Or_Die-taster.png - :target: Heal_Or_Die/index.html - :width: 200 - - Game environment ported from https://github.com/GAIGResearch/Stratega. - You have units that heal and units that perform close combat. - Additionally, on every turn, the health of your units decreases. Win the game by killing your opponents pieces first. - - * - **Kill The King** - - .. image:: img/Kill_The_King-taster.png - :target: Kill_The_King/index.html - :width: 200 - - Game environment ported from https://github.com/GAIGResearch/Stratega. - Both you and your opponent must protect the king from being killed. - - - - - - - ************* Single-Player ************* @@ -61,118 +7,142 @@ Single-Player .. toctree:: :hidden: - Drunk_Dwarf/index Spiders/index - Doggo/index Eyeball/index - Zen_Puzzle/index - Partially_Observable_Zelda/index - Bait/index - Labyrinth/index - Partially_Observable_Cook_Me_Pasta/index - Partially_Observable_Bait/index + Drunk_Dwarf/index + Doggo/index + Butterflies_and_Spiders/index Partially_Observable_Sokoban_-_2/index - Sokoban/index - Random_butterflies/index - Bait_With_Keys/index - Clusters/index + Labyrinth/index + Bait/index Partially_Observable_Zen_Puzzle/index - Sokoban_-_2/index - Zelda/index - Partially_Observable_Clusters/index + Partially_Observable_Cook_Me_Pasta/index Spider_Nest/index Partially_Observable_Labyrinth/index + Sokoban_-_2/index + Partially_Observable_Clusters/index + Bait_With_Keys/index + Random_butterflies/index Cook_Me_Pasta/index - Butterflies_and_Spiders/index + Partially_Observable_Bait/index Zelda_Sequential/index + Partially_Observable_Zelda/index + Sokoban/index + Zelda/index + Clusters/index + Zen_Puzzle/index .. list-table:: :class: game-gallery - * - **Drunk Dwarf** - - .. image:: img/Drunk_Dwarf-taster.png - :target: Drunk_Dwarf/index.html - :width: 200 - - A port of the games provided in the https://github.com/maximecb/gym-minigrid environment, but you're a drunk dwarf trying find your keys that you've dropped to get to your bed (which is a coffin?? Wierd.). - - **Spiders** + * - **Spiders** .. image:: img/Spiders-taster.png :target: Spiders/index.html :width: 200 A port of the games provided in the https://github.com/maximecb/gym-minigrid Dynamic obstacles environment, but you're a gnome avoiding ghosts to get to a gem. - - **Doggo** + - **Eyeball** + + .. image:: img/Eyeball-taster.png + :target: Eyeball/index.html + :width: 200 + + A port of the games provided in the https://github.com/maximecb/gym-minigrid 4 Rooms environment, but you're a giant eye looking for it's eyedrops because everything is yellow and it hurts to look at. + - **Drunk Dwarf** + + .. image:: img/Drunk_Dwarf-taster.png + :target: Drunk_Dwarf/index.html + :width: 200 + + A port of the games provided in the https://github.com/maximecb/gym-minigrid environment, but you're a drunk dwarf trying find your keys that you've dropped to get to your bed (which is a coffin?? Wierd.). + * - **Doggo** .. image:: img/Doggo-taster.png :target: Doggo/index.html :width: 200 A port of the games provided in the https://github.com/maximecb/gym-minigrid Empty environment, but you're a doggo fetching a stick. - * - **Eyeball** + - **Butterflies and Spiders** - .. image:: img/Eyeball-taster.png - :target: Eyeball/index.html + .. image:: img/Butterflies_and_Spiders-taster.png + :target: Butterflies_and_Spiders/index.html :width: 200 - A port of the games provided in the https://github.com/maximecb/gym-minigrid 4 Rooms environment, but you're a giant eye looking for it's eyedrops because everything is yellow and it hurts to look at. - - **Zen Puzzle** + You want to catch all of the butterflies while also avoiding the spiders. Butterflies spawn slowly from cocoons. + The butterflies are also eaten by the spiders so you need to be fast to collect them. + You win the level as soon as there are no butterflies on the screen. - .. image:: img/Zen_Puzzle-taster.png - :target: Zen_Puzzle/index.html + - **Partially Observable Sokoban - 2** + + .. image:: img/Partially_Observable_Sokoban_-_2-taster.png + :target: Partially_Observable_Sokoban_-_2/index.html :width: 200 - Set all the tiles in the level to the same color, but you cannot move over a tile more than once! (Not even sure why this is zen its super frustrating) - - **Partially Observable Zelda** + Push the boxes onto the marked spaces, once a box has moved onto a space, it cannot be moved + * - **Labyrinth** - .. image:: img/Partially_Observable_Zelda-taster.png - :target: Partially_Observable_Zelda/index.html + .. image:: img/Labyrinth-taster.png + :target: Labyrinth/index.html :width: 200 - A port of the GVGAI game "Zelda", but partially observable. Pick up keys to reach doors and avoid enemies. - * - **Bait** + Its a maze, find your way out. Watch out for spikey things. + - **Bait** .. image:: img/Bait-taster.png :target: Bait/index.html :width: 200 Get the key and unlock the door. Fill in the holes in the floor with blocks to get to the key. - - **Labyrinth** + - **Partially Observable Zen Puzzle** - .. image:: img/Labyrinth-taster.png - :target: Labyrinth/index.html + .. image:: img/Partially_Observable_Zen_Puzzle-taster.png + :target: Partially_Observable_Zen_Puzzle/index.html :width: 200 - Its a maze, find your way out. Watch out for spikey things. - - **Partially Observable Cook Me Pasta** + Set all the tiles in the level to the same color, but you cannot move over a tile more than once! (Not even sure why this is zen its super frustrating) + * - **Partially Observable Cook Me Pasta** .. image:: img/Partially_Observable_Cook_Me_Pasta-taster.png :target: Partially_Observable_Cook_Me_Pasta/index.html :width: 200 Help the chef create the meal, but make sure the ingredients are put together in the right order. - * - **Partially Observable Bait** + - **Spider Nest** - .. image:: img/Partially_Observable_Bait-taster.png - :target: Partially_Observable_Bait/index.html + .. image:: img/Spider_Nest-taster.png + :target: Spider_Nest/index.html :width: 200 - Get the key and unlock the door. Fill in the holes in the floor with blocks to get to the key. - - **Partially Observable Sokoban - 2** + A port of the games provided in the https://github.com/maximecb/gym-minigrid Dynamic obstacles environment, but you're a gnome avoiding ghosts to get to a gem. + - **Partially Observable Labyrinth** - .. image:: img/Partially_Observable_Sokoban_-_2-taster.png - :target: Partially_Observable_Sokoban_-_2/index.html + .. image:: img/Partially_Observable_Labyrinth-taster.png + :target: Partially_Observable_Labyrinth/index.html + :width: 200 + + Its a maze, find your way out. Watch out for spikey things. In this version the observation space for the player is partial. + * - **Sokoban - 2** + + .. image:: img/Sokoban_-_2-taster.png + :target: Sokoban_-_2/index.html :width: 200 Push the boxes onto the marked spaces, once a box has moved onto a space, it cannot be moved - - **Sokoban** + - **Partially Observable Clusters** - .. image:: img/Sokoban-taster.png - :target: Sokoban/index.html + .. image:: img/Partially_Observable_Clusters-taster.png + :target: Partially_Observable_Clusters/index.html :width: 200 - Push the boxes into holes. + Cluster the coloured objects together by pushing them against the static coloured blocks. + - **Bait With Keys** + + .. image:: img/Bait_With_Keys-taster.png + :target: Bait_With_Keys/index.html + :width: 200 + + Get the key and unlock the door. Fill in the holes in the floor with blocks to get to the key. (This environment is the same as the normal Bait environment, but if the avatar has the key, it is visible) * - **Random butterflies** .. image:: img/Random_butterflies-taster.png @@ -184,86 +154,116 @@ Single-Player You win the level as soon as there are no butterflies left. The player also only has partial observability. - - **Bait With Keys** + - **Cook Me Pasta** - .. image:: img/Bait_With_Keys-taster.png - :target: Bait_With_Keys/index.html + .. image:: img/Cook_Me_Pasta-taster.png + :target: Cook_Me_Pasta/index.html :width: 200 - Get the key and unlock the door. Fill in the holes in the floor with blocks to get to the key. (This environment is the same as the normal Bait environment, but if the avatar has the key, it is visible) - - **Clusters** + Help the chef create the meal, but make sure the ingredients are put together in the right order. + - **Partially Observable Bait** - .. image:: img/Clusters-taster.png - :target: Clusters/index.html + .. image:: img/Partially_Observable_Bait-taster.png + :target: Partially_Observable_Bait/index.html :width: 200 - Cluster the coloured objects together by pushing them against the static coloured blocks. - * - **Partially Observable Zen Puzzle** + Get the key and unlock the door. Fill in the holes in the floor with blocks to get to the key. + * - **Zelda Sequential** - .. image:: img/Partially_Observable_Zen_Puzzle-taster.png - :target: Partially_Observable_Zen_Puzzle/index.html + .. image:: img/Zelda_Sequential-taster.png + :target: Zelda_Sequential/index.html :width: 200 - Set all the tiles in the level to the same color, but you cannot move over a tile more than once! (Not even sure why this is zen its super frustrating) - - **Sokoban - 2** + A port of the GVGAI game "Zelda". Pick up keys to reach doors in the correct order and avoid enemies. For example, previously you could go -- key -> door -> door. But now you would need to go -- key -> door --> key --> door. + - **Partially Observable Zelda** - .. image:: img/Sokoban_-_2-taster.png - :target: Sokoban_-_2/index.html + .. image:: img/Partially_Observable_Zelda-taster.png + :target: Partially_Observable_Zelda/index.html :width: 200 - Push the boxes onto the marked spaces, once a box has moved onto a space, it cannot be moved - - **Zelda** + A port of the GVGAI game "Zelda", but partially observable. Pick up keys to reach doors and avoid enemies. + - **Sokoban** + + .. image:: img/Sokoban-taster.png + :target: Sokoban/index.html + :width: 200 + + Push the boxes into holes. + * - **Zelda** .. image:: img/Zelda-taster.png :target: Zelda/index.html :width: 200 A port of the GVGAI game "Zelda". Pick up keys to reach doors and avoid enemies. - * - **Partially Observable Clusters** + - **Clusters** - .. image:: img/Partially_Observable_Clusters-taster.png - :target: Partially_Observable_Clusters/index.html + .. image:: img/Clusters-taster.png + :target: Clusters/index.html :width: 200 Cluster the coloured objects together by pushing them against the static coloured blocks. - - **Spider Nest** + - **Zen Puzzle** - .. image:: img/Spider_Nest-taster.png - :target: Spider_Nest/index.html + .. image:: img/Zen_Puzzle-taster.png + :target: Zen_Puzzle/index.html :width: 200 - A port of the games provided in the https://github.com/maximecb/gym-minigrid Dynamic obstacles environment, but you're a gnome avoiding ghosts to get to a gem. - - **Partially Observable Labyrinth** + Set all the tiles in the level to the same color, but you cannot move over a tile more than once! (Not even sure why this is zen its super frustrating) - .. image:: img/Partially_Observable_Labyrinth-taster.png - :target: Partially_Observable_Labyrinth/index.html + +*** +RTS +*** + +.. toctree:: + :hidden: + + GriddlyRTS/index + Push_Mania/index + Kill_The_King/index + Heal_Or_Die/index + +.. list-table:: + :class: game-gallery + + * - **GriddlyRTS** + + .. image:: img/GriddlyRTS-taster.png + :target: GriddlyRTS/index.html :width: 200 - Its a maze, find your way out. Watch out for spikey things. In this version the observation space for the player is partial. - * - **Cook Me Pasta** + An RTS Game. There's aliens and stuff. + - **Push Mania** - .. image:: img/Cook_Me_Pasta-taster.png - :target: Cook_Me_Pasta/index.html + .. image:: img/Push_Mania-taster.png + :target: Push_Mania/index.html :width: 200 - Help the chef create the meal, but make sure the ingredients are put together in the right order. - - **Butterflies and Spiders** + Game environment ported from https://github.com/GAIGResearch/Stratega. + You must push all your opponents pieces into the holes. - .. image:: img/Butterflies_and_Spiders-taster.png - :target: Butterflies_and_Spiders/index.html + - **Kill The King** + + .. image:: img/Kill_The_King-taster.png + :target: Kill_The_King/index.html :width: 200 - You want to catch all of the butterflies while also avoiding the spiders. Butterflies spawn slowly from cocoons. - The butterflies are also eaten by the spiders so you need to be fast to collect them. - You win the level as soon as there are no butterflies on the screen. + Game environment ported from https://github.com/GAIGResearch/Stratega. + Both you and your opponent must protect the king from being killed. - - **Zelda Sequential** + * - **Heal Or Die** - .. image:: img/Zelda_Sequential-taster.png - :target: Zelda_Sequential/index.html + .. image:: img/Heal_Or_Die-taster.png + :target: Heal_Or_Die/index.html :width: 200 - A port of the GVGAI game "Zelda". Pick up keys to reach doors in the correct order and avoid enemies. For example, previously you could go -- key -> door -> door. But now you would need to go -- key -> door --> key --> door. + Game environment ported from https://github.com/GAIGResearch/Stratega. + You have units that heal and units that perform close combat. + Additionally, on every turn, the health of your units decreases. Win the game by killing your opponents pieces first. + + - + - *********** @@ -273,21 +273,21 @@ Multi-Agent .. toctree:: :hidden: - Foragers/index + Robot_Tag_12v12/index Robot_Tag_8v8/index + Foragers/index Robot_Tag_4v4/index - Robot_Tag_12v12/index .. list-table:: :class: game-gallery - * - **Foragers** + * - **Robot Tag 12v12** - .. image:: img/Foragers-taster.png - :target: Foragers/index.html + .. image:: img/Robot_Tag_12v12-taster.png + :target: Robot_Tag_12v12/index.html :width: 200 - A very simple multi-agent game. Agents must collect the coloured potions + Robots start randomly as "tagged" or not, robots can "tag" other robots. Any robot that is "tagged" 3 times dies. - **Robot Tag 8v8** .. image:: img/Robot_Tag_8v8-taster.png @@ -295,17 +295,17 @@ Multi-Agent :width: 200 Robots start randomly as "tagged" or not, robots can "tag" other robots. Any robot that is "tagged" 3 times dies. - - **Robot Tag 4v4** + - **Foragers** - .. image:: img/Robot_Tag_4v4-taster.png - :target: Robot_Tag_4v4/index.html + .. image:: img/Foragers-taster.png + :target: Foragers/index.html :width: 200 - Robots start randomly as "tagged" or not, robots can "tag" other robots. Any robot that is "tagged" 3 times dies. - * - **Robot Tag 12v12** + A very simple multi-agent game. Agents must collect the coloured potions + * - **Robot Tag 4v4** - .. image:: img/Robot_Tag_12v12-taster.png - :target: Robot_Tag_12v12/index.html + .. image:: img/Robot_Tag_4v4-taster.png + :target: Robot_Tag_4v4/index.html :width: 200 Robots start randomly as "tagged" or not, robots can "tag" other robots. Any robot that is "tagged" 3 times dies. diff --git a/docs/index.rst b/docs/index.rst index 52d51d03b..039b959ac 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -60,6 +60,7 @@ Griddly documentation. tutorials/GDY/index tutorials/GDY Schema/index tutorials/Proximity Triggers/index + tutorials/Custom Shaders/index .. toctree:: :maxdepth: 10 diff --git a/docs/requirements.txt b/docs/requirements.txt index 4ef3f775b..d1513c69d 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,5 +1,5 @@ -sphinx==4.0.2 -recommonmark==0.6.0 -sphinx_rtd_theme==0.5.2 -sphinxcontrib-images==0.9.3 -sphinx-copybutton==0.3.1 \ No newline at end of file +sphinx==4.3.2 +recommonmark==0.7.1 +sphinx_rtd_theme==1.0.0 +sphinxcontrib-images==0.9.4 +sphinx-copybutton==0.4.0 diff --git a/docs/tutorials/Custom Shaders/Global Lighting/img/daynight.png b/docs/tutorials/Custom Shaders/Global Lighting/img/daynight.png new file mode 100644 index 000000000..07022c363 Binary files /dev/null and b/docs/tutorials/Custom Shaders/Global Lighting/img/daynight.png differ diff --git a/docs/tutorials/Custom Shaders/Global Lighting/img/daynight_naive.png b/docs/tutorials/Custom Shaders/Global Lighting/img/daynight_naive.png new file mode 100644 index 000000000..8db176c1c Binary files /dev/null and b/docs/tutorials/Custom Shaders/Global Lighting/img/daynight_naive.png differ diff --git a/docs/tutorials/Custom Shaders/Global Lighting/index.rst b/docs/tutorials/Custom Shaders/Global Lighting/index.rst new file mode 100644 index 000000000..fd1147839 --- /dev/null +++ b/docs/tutorials/Custom Shaders/Global Lighting/index.rst @@ -0,0 +1,235 @@ +.. _doc_tutorials_custom_shaders_global_lighting: + +############### +Global Lighting +############### + +In this tutorial we modify the :ref:`Bufferflies ` environment to have a day/night cycle. In environments that use pixel-based observations this can provide an additional challenge to agents, as the agent has to encode the pixel representations of the envrionment in a way that allows for many different lighting levels. + +.. raw:: html + +
+ +

+
+ +********************* +Naive Day/Night Cycle +********************* + +We want the value of the pixels to cycle from black (night) to their *actual* (daylight) values. We can do this by multiplying the RGB values by a **light level** value :math:`L` that oscillates (with respect to ``_steps`` :math:`s`) between 0 and 1. + +We could just use: + +.. math:: L = \cos \left(\frac{\pi s}{360}\right) + +.. figure:: img/daynight_naive.png + :width: 50% + :align: center + +but this would mean that we would only reach full daylight and complete darkness once every 360 steps. What we actually want is light for maybe 50% of the time and then a short-ish night. + +For this we can use: + +.. math:: L = \min(1 ,\cos \left(\frac{\pi s}{360} \right)+1) + +.. figure:: img/daynight.png + :width: 50% + :align: center + +Now we have an algorithm for calculating the light level coefficient, how do we apply this in our custom shaders? + + +********************************* +Using global variables in shaders +********************************* + +To implement our day/night cycle using our :math:`L` value, we first have to understand a few features that are available in the Griddly engine. + +How does Griddly handle "time"? +=============================== + +Griddly has a built-in step counter called ``_steps`` which can be accessed as a global variable. This value is equal to the number of steps that have passed in a particular episode. + + +How can we pass the ``_steps`` parameter to the shader? +======================================================= + +The ``_steps`` parameter is automatically passed to the shader by default. Other global variables can be passed to the shader by specifying it in the GDY :ref:`Shader options <#/properties/Environment/properties/Observers/properties/Sprite2D/properties/Shader>`. An example of this is shown below. + +.. code:: yaml + + Observers: + Sprite2D: + Shader: + # The _steps variable is automatically exported to all shaders, so we cannot add it here, + # but this is how we would add custom global variables + GlobalVariables: [global_variable1, global_variable2] + + +How can we read the ``_steps`` parameter and use it? +==================================================== + +Global variables specified in the ``Shader`` configuration of the GDY file, are sent to the shader in the same order that they are specified in the GDY. However the ``_steps`` variable is also included by default in position ``0``. + +In the shader, we can use the ``GlobalVariable`` uniform buffer: + +.. code:: glsl + + layout(std430, binding = 4) readonly buffer GlobalVariableBuffer { + GlobalVariable variables[]; + } + globalVariableBuffer; + + # globalVariableBuffer.variables[0] # this is the value of _steps + +Now we know how to access the variable in the shader, how can we customize the shaders to modify the pixel values to what we want? + +.. note:: more information on compiling custom shaders and using them in Griddly envs can be found :ref:`here ` + +*********************** +Global Lighting Shaders +*********************** + + +Vertex +====== + +Most of the code in the vertex shader is standard code required for drawing the observation. + +We calculate the lighting level in the vertex shader (so we don't need to calculate it for every pixel) and pass it to the fragment shader using ``outLightLevel`` + +.. code:: glsl + + #version 460 + + layout(location = 0) in vec3 inPosition; + layout(location = 1) in vec2 inFragTextureCoords; + + layout(location = 0) out vec4 outLightLevel; + layout(location = 1) out vec3 outFragTextureCoords; + + out gl_PerVertex { + vec4 gl_Position; + }; + + struct GlobalVariable { + int value; + }; + + struct ObjectVariable { + int value; + }; + + struct PlayerInfo { + vec4 playerColor; + }; + + struct ObjectData { + mat4 modelMatrix; + vec4 color; + vec2 textureMultiply; + int textureIndex; + int objectType; + int playerId; + int zIdx; + }; + + layout(std140, binding = 1) uniform EnvironmentData { + mat4 projectionMatrix; + mat4 viewMatrix; + vec2 gridDims; + int playerId; + int globalVariableCount; + int objectVariableCount; + int highlightPlayers; + } + environmentData; + + layout(std430, binding = 2) readonly buffer PlayerInfoBuffer { + PlayerInfo variables[]; + } + playerInfoBuffer; + + layout(std430, binding = 3) readonly buffer ObjectDataBuffer { + uint size; + ObjectData variables[]; + } + objectDataBuffer; + + layout(std430, binding = 4) readonly buffer GlobalVariableBuffer { + GlobalVariable variables[]; + } + globalVariableBuffer; + + layout(std430, binding = 5) readonly buffer ObjectVariableBuffer { + ObjectVariable variables[]; + } + objectVariableBuffer; + + layout(push_constant) uniform PushConsts { + int idx; + } + pushConsts; + + #define PI 3.1415926538 + + void main() { + ObjectData object = objectDataBuffer.variables[pushConsts.idx]; + + float steps = float(globalVariableBuffer.variables[0].value); + + // 360 steps is roughly 1 day + float lightLevel = clamp(cos(PI*steps/360)+1.0, 0.0, 1.0); + outLightLevel = vec4(lightLevel,lightLevel,lightLevel,1.0); + + outFragTextureCoords = vec3( + inFragTextureCoords.x * object.textureMultiply.x, + inFragTextureCoords.y * object.textureMultiply.y, + object.textureIndex); + + mat4 mvp = environmentData.projectionMatrix * environmentData.viewMatrix * object.modelMatrix; + + gl_Position = mvp * vec4( + inPosition.x, + inPosition.y, + inPosition.z, + 1.); + } + + +Fragment +======== + +In the fragment shader, we simply multiply our ``inLightLevel`` which is passed from the vertex shader by the texture fragment color (this is our RGB values). + +Note that here we have also removed the code for highlighting the players thats present in the default shader as we don't need it for this environment. + +.. code:: glsl + + #version 460 + + layout(binding = 0) uniform sampler2DArray samplerArray; + + layout(location = 0) in vec4 inLightLevel; + layout(location = 1) in vec3 inFragTextureCoords; + + layout(location = 0) out vec4 outFragColor; + + void main() { + outFragColor = texture(samplerArray, inFragTextureCoords) * inLightLevel; + } + + + +***************** +Full Code Example +***************** + +`Full code examples can be found here! `_ \ No newline at end of file diff --git a/docs/tutorials/Custom Shaders/Health Bars/img/sdf_health_bar.png b/docs/tutorials/Custom Shaders/Health Bars/img/sdf_health_bar.png new file mode 100644 index 000000000..65a704a5a Binary files /dev/null and b/docs/tutorials/Custom Shaders/Health Bars/img/sdf_health_bar.png differ diff --git a/docs/tutorials/Custom Shaders/Health Bars/index.rst b/docs/tutorials/Custom Shaders/Health Bars/index.rst new file mode 100644 index 000000000..c3008dcf0 --- /dev/null +++ b/docs/tutorials/Custom Shaders/Health Bars/index.rst @@ -0,0 +1,310 @@ +.. _doc_tutorials_custom_shaders_health_bars: + +############ +Health Bars +############ + +We create a simple 4v4 environment where agents control a `robot`. Each robot has a health value and can attacks the other robots in the environment. The aim of this environment is for the robots to defeat the otehr robots. + +In this tutorial we use a custom shader and signed distance fields to draw health bars. + +.. raw:: html + +
+ +

+
+ + +************************ +Calculating Health Bars +************************ + +Let's say each `robot` unit has a current health value ``health`` and a maximum health value ``max_health``. + +We can set the ``max_health`` and initial ``health`` value in the GDY for the `robot` units like this: + +.. code:: yaml + + - Name: robot + MapCharacter: f + Variables: + - Name: health + InitialValue: 10 + - Name: max_health + InitialValue: 10 + +We can then expose these variables to the shader by passing them in the ``Shader`` config for the ``Sprite2D`` renderer. + +.. code:: yaml + + Sprite2D: + Shader: + ObjectVariables: [ health, max_health ] + +These variables can then be accessed in the shader using the following helper function. + +.. code:: glsl + + int getObjectVariable(in int objectIndex, in int variableIndex, in int numVariables) { + return objectVariableBuffer.variables[objectIndex*numVariables+variableIndex].value; + } + + +``objectIndex`` will be the value of the current object index being drawn. This value is sent to the shader as the `push constant` ``idx``. +``variableIndex`` is the index of the variable in the ``ObjectVariables``, for example, 0 for ``health`` and 1 for ``max_health``. +Finally ``numVariables`` is the number of variables that is provided in the ``ObjectVariables`` configuration. In our case this is 2. + +We can retrieve the ``health`` and ``max_health`` values in the shader by calling this function with the following arguments: + +.. code:: glsl + + int health = getObjectVariable(pushConsts.idx, 0, environmentData.objectVariableCount); + int maxHealth = getObjectVariable(pushConsts.idx, 1, environmentData.objectVariableCount); + + if(object.objectType == 2) { + outNormalizedHealth = float(health)/float(maxHealth); + } else { + outNormalizedHealth = -1.0; + } + +We also normalize the health value for ``robot`` objects, but set it to -1.0 for all other objects. We normalize this value here because then it makes it very simple to adjust the initial and maximum health values without changing and recompiling the shader. +It also means that this code can be re-used in environments with many objects that have many objects with different health values. +In the fragment shader, we ignore drawing health bars when the normalized health value is less than 0. + +.. note:: ``object.objectType`` here is the index of `alphabetically` sorted object names. The ordered list of object names can also returned by calling ``env.get_object_names()``. + +We dont want to calculate this for every pixel, as this is inefficient. So we put this code into the `vertex` shader and then send this value to the `fragment` shader. + +Drawing Health Bars with Signed Distance Fields +=============================================== + +.. figure:: img/sdf_health_bar.png + :align: center + + ``bar_center`` and ``bar_height`` are used to calculate whether or not to change the colour of a pixel in the fragment shader. We calculate if the pixel is *within* the health bar and change its color accordingly. + + +The fragment shader operates on every pixel that we are drawing. The coordinates of the pixel of the *texture* that we are currenty drawing are given by ``inFragTextureCoords``. +This means we can override the current pixel color with health bar if the pixel itself is *in* the area that we want to health bar to occupy. + +Our health bar always has a constant height, so we can check that the current pixel is at the **top** of the texture using the following code: + +.. code:: glsl + + vec2 tex_dims=vec2(textureSize(samplerArray,0)); + float bar_height=1.0/tex_dims.y; + + bool isAtTop = distance(inFragTextureCoords.y,bar_height)0){ + vec2 tex_dims=vec2(textureSize(samplerArray,0)); + float bar_height=1.0/tex_dims.y; + float bar_center_x=inNormalizedHealth/2.0; + + if(distance(inFragTextureCoords.x,bar_center_x) 0.5) { + outFragColor=vec4(0.0,1.0,0.,1.); + } else if(inNormalizedHealth > 0.25) { + outFragColor=vec4(1.0,1.0,0.,1.); + } else { + outFragColor=vec4(1.0,0.0,0.,1.); + } + isHealthBar = true; + } + } + +******************* +Health Bar Shaders +******************* + +We can now tie all of this together in our vertex and fragment shaders! + +Vertex +====== + +Again in our vertex shader we have the standard boiler plate code which gives us access to the variables from the Griddly Engine. +How this ties in with the explanation of the normalized health calculations can be seen in full here: + +.. code:: glsl + + #version 460 + + layout(location = 0) in vec3 inPosition; + layout(location = 1) in vec2 inFragTextureCoords; + + layout(location = 0) out float outNormalizedHealth; + layout(location = 1) out vec3 outFragTextureCoords; + + out gl_PerVertex { + vec4 gl_Position; + }; + + struct GlobalVariable { + int value; + }; + + struct ObjectVariable { + int value; + }; + + struct PlayerInfo { + vec4 playerColor; + }; + + struct ObjectData { + mat4 modelMatrix; + vec4 color; + vec2 textureMultiply; + int textureIndex; + int objectType; + int playerId; + int zIdx; + }; + + layout(std140, binding = 1) uniform EnvironmentData { + mat4 projectionMatrix; + mat4 viewMatrix; + vec2 gridDims; + int playerId; + int globalVariableCount; + int objectVariableCount; + int highlightPlayers; + } + environmentData; + + layout(std430, binding = 2) readonly buffer PlayerInfoBuffer { + PlayerInfo variables[]; + } + playerInfoBuffer; + + layout(std430, binding = 3) readonly buffer ObjectDataBuffer { + uint size; + ObjectData variables[]; + } + objectDataBuffer; + + layout(std430, binding = 4) readonly buffer GlobalVariableBuffer { + GlobalVariable variables[]; + } + globalVariableBuffer; + + layout(std430, binding = 5) readonly buffer ObjectVariableBuffer { + ObjectVariable variables[]; + } + objectVariableBuffer; + + layout(push_constant) uniform PushConsts { + int idx; + } + pushConsts; + + int getObjectVariable(in int objectIndex, in int variableIndex, in int numVariables) { + return objectVariableBuffer.variables[objectIndex*numVariables+variableIndex].value; + } + + void main() { + ObjectData object = objectDataBuffer.variables[pushConsts.idx]; + + int health = getObjectVariable(pushConsts.idx, 0, environmentData.objectVariableCount); + int maxHealth = getObjectVariable(pushConsts.idx, 1, environmentData.objectVariableCount); + + if(object.objectType == 2) { + outNormalizedHealth = float(health)/float(maxHealth); + } else { + outNormalizedHealth = -1.0; + } + + PlayerInfo objectPlayerInfo = playerInfoBuffer.variables[object.playerId - 1]; + + outFragTextureCoords = vec3( + inFragTextureCoords.x * object.textureMultiply.x, + inFragTextureCoords.y * object.textureMultiply.y, + object.textureIndex); + + mat4 mvp = environmentData.projectionMatrix * environmentData.viewMatrix * object.modelMatrix; + + gl_Position = mvp * vec4( + inPosition.x, + inPosition.y, + inPosition.z, + 1.); + + } + +Fragment +======== + +The entire Fragment shader can be seen here. +Notice also that we check if the pixel being drawn is a health bar or not, and if it is *not* we just sample from the texture array to get the pixel for the sprite image. + +.. code:: glsl + + #version 460 + + layout(binding = 0) uniform sampler2DArray samplerArray; + + layout(location = 0) in float inNormalizedHealth; + layout(location = 1) in vec3 inFragTextureCoords; + + layout(location = 0) out vec4 outFragColor; + + void main() { + bool isHealthBar = false; + // Draw health bar at the top of the sprite using distance fields + if(inNormalizedHealth>0){ + vec2 tex_dims=vec2(textureSize(samplerArray,0)); + float bar_height=1.0/tex_dims.y; + float bar_center_x=inNormalizedHealth/2.0; + + if(distance(inFragTextureCoords.x,bar_center_x) 0.5) { + outFragColor=vec4(0.0,1.0,0.,1.); + } else if(inNormalizedHealth > 0.25) { + outFragColor=vec4(1.0,1.0,0.,1.); + } else { + outFragColor=vec4(1.0,0.0,0.,1.); + } + isHealthBar = true; + } + } + + if (!isHealthBar) { + outFragColor=texture(samplerArray,inFragTextureCoords); + } + } + + + +***************** +Full Code Example +***************** + +`Full code examples can be found here! `_ \ No newline at end of file diff --git a/docs/tutorials/Custom Shaders/Object Lighting/img/lighting_multiple.png b/docs/tutorials/Custom Shaders/Object Lighting/img/lighting_multiple.png new file mode 100644 index 000000000..081bf9802 Binary files /dev/null and b/docs/tutorials/Custom Shaders/Object Lighting/img/lighting_multiple.png differ diff --git a/docs/tutorials/Custom Shaders/Object Lighting/img/lighting_single.png b/docs/tutorials/Custom Shaders/Object Lighting/img/lighting_single.png new file mode 100644 index 000000000..485b6f6fe Binary files /dev/null and b/docs/tutorials/Custom Shaders/Object Lighting/img/lighting_single.png differ diff --git a/docs/tutorials/Custom Shaders/Object Lighting/img/reset_global.png b/docs/tutorials/Custom Shaders/Object Lighting/img/reset_global.png new file mode 100644 index 000000000..893cfbf47 Binary files /dev/null and b/docs/tutorials/Custom Shaders/Object Lighting/img/reset_global.png differ diff --git a/docs/tutorials/Custom Shaders/Object Lighting/img/reset_partial.png b/docs/tutorials/Custom Shaders/Object Lighting/img/reset_partial.png new file mode 100644 index 000000000..586f06afa Binary files /dev/null and b/docs/tutorials/Custom Shaders/Object Lighting/img/reset_partial.png differ diff --git a/docs/tutorials/Custom Shaders/Object Lighting/index.rst b/docs/tutorials/Custom Shaders/Object Lighting/index.rst new file mode 100644 index 000000000..1fe00977c --- /dev/null +++ b/docs/tutorials/Custom Shaders/Object Lighting/index.rst @@ -0,0 +1,319 @@ +.. _doc_tutorials_custom_shaders_object_lighting: + +################ +Object Lighting +################ + +In this tutorial we will learn how to create a custom shader that performs per-object lighting. + +We modify the :ref:`Partially Observable Labyrinth ` environment to be completely dark apart from around the goal state and the agent itself. + + +.. raw:: html + +
+ +

Environment rendered with global observer

+
+ +Also, because this environment is partially observable, the agent itself will see observations like below: + +.. figure:: img/reset_partial.png + :width: 15% + :align: center + + Partially observable view of agent using the object shaders. + + +*************************** +Lighting Individual Objects +*************************** + +Vertex shaders operate on each vertex (each corner of a sprite image), and fragment shaders operate on the individual pixels. To get the desired lighting effects, we don't need to do any calculations in the vertex shader. + +In the Fragment shader however, we need to calculate how close we are to objects that emit light. Then we need to calculate how *bright* a pixel is. + +Light Emitting Objects +====================== + +we can define light emitting objects using object variables in the GDY: + +For the avatar object: + +.. code:: yaml + + Name: avatar + MapCharacter: A + Variables: + - Name: is_light + InitialValue: 1 + +For the exit object: + +.. code:: yaml + + Name: exit + MapCharacter: x + Variables: + - Name: is_light + InitialValue: 1 + + +We can then expose these variables to the shader by passing them in the ``Shader`` config for the ``Sprite2D`` renderer. + +.. code:: yaml + + Sprite2D: + Shader: + ObjectVariables: [ is_light ] + +In the shader, we can access object variables using the following helper function: + +.. code:: glsl + + int getObjectVariable(in int objectIndex, in int variableIndex, in int numVariables) { + return objectVariableBuffer.variables[objectIndex*numVariables+variableIndex].value; + } + + +``objectIndex`` will be the value of the current object index being drawn. This value is sent to the shader as the `push constant` ``idx``. +``variableIndex`` is the index of the variable in the ``ObjectVariables``, for example, 0 for ``is_light``. If we required other variables, they would be available at subsequenct indexes. +Finally ``numVariables`` is the number of variables that is provided in the ``ObjectVariables`` configuration. In our case this is 1 as we only define ``is_light``. + +To retrieve the ``is_light`` value for any object :math:`i`, we can call the helper function with the following arguments: + +.. code:: glsl + + int isLight = getObjectVariable(i, 0, 1); + +Calculating Light Levels +======================== + +To create the desired effect, we need to come up with a function that is lighter closer to the object, but fades out further away from the object. + +we can use the following equation to work out the *brightness* :math:`B` of a pixel as a function of the inverse square of distance to each light emitting object :math:`O`. We also clip the values between 0.0 and 1.0: + +.. math:: L = \max \left(0, \min \left(1, \sum\limits_{i=0}^n \left(\frac{1}{a|\overrightarrow{BO_i}|^2} - b\right)\right)\right) + +:math:`n` here is the total number of light emitting objects. :math:`a` and :math:`b` are parameters we can adjust to get the desired lighting effects. + +.. note:: We use the values :math:`a=1/30` and :math:`b=0.1` in this tutorial but feel free to modify them. + +With a single object at :math:`O_0 = 100`, the plot of Lighting level :math:`L` against distance :math:`|\overrightarrow{BO_i}|` looks like this: + +.. figure:: img/lighting_single.png + :width: 50% + :align: center + + +With multiple objects, :math:`O_0 = 100` and :math:`O_1 = 300`: + +.. figure:: img/lighting_multiple.png + :width: 50% + :align: center + +To do this in the fragment shader, we iterate through all objects, check that the object is an object with lights (in this case, object type 0 and object type 1). We then calculate the above equation to get the light level: + +.. code:: glsl + + float lightLevel = 0.0; + for (int i = 0; i < objectDataBuffer.size; i++) { + ObjectData object = objectDataBuffer.variables[i]; + + if (object.objectType == 0 || object.objectType == 1) { + int isLight = getObjectVariable(i, 0, 1); + if (isLight == 1) { + mat4 mv = environmentData.viewMatrix * object.modelMatrix; + vec4 position = mv * vec4(0, 0, 0, 1); + float dist_to_pixel = distance(position.xy, gl_FragCoord.xy); + lightLevel += 1.0/pow(dist_to_pixel / 30.0, 2.0) - 0.1; + } + } + } + + lightLevel = max(0, min(1.0, lightLevel)); + +We can then calculate the final pixel value by multiplying the light level by the RGB components of the texture that is being rendered: + +.. code:: glsl + + outFragColor = texture(samplerArray, inFragTextureCoords) * vec4(lightLevel, lightLevel, lightLevel, 1.0); + + +*********************** +Object Lighting Shaders +*********************** + +Putting all of this together in our fragement and vertex shaders we have the following: + +Vertex +====== + +.. code:: glsl + + #version 460 + + layout(location = 0) in vec3 inPosition; + layout(location = 1) in vec2 inFragTextureCoords; + + layout(location = 0) out vec4 outColor; + layout(location = 1) out vec3 outFragTextureCoords; + layout(location = 2) out vec4 outPlayerColor; + + out gl_PerVertex { + vec4 gl_Position; + }; + + struct ObjectData { + mat4 modelMatrix; + vec4 color; + vec2 textureMultiply; + int textureIndex; + int objectType; + int playerId; + int zIdx; + }; + + layout(std140, binding = 1) uniform EnvironmentData { + mat4 projectionMatrix; + mat4 viewMatrix; + vec2 gridDims; + int playerId; + int globalVariableCount; + int objectVariableCount; + int highlightPlayers; + } + environmentData; + + layout(std430, binding = 3) readonly buffer ObjectDataBuffer { + uint size; + ObjectData variables[]; + } + objectDataBuffer; + + layout(push_constant) uniform PushConsts { + int idx; + } + pushConsts; + + + void main() { + ObjectData object = objectDataBuffer.variables[pushConsts.idx]; + + outFragTextureCoords = vec3( + inFragTextureCoords.x * object.textureMultiply.x, + inFragTextureCoords.y * object.textureMultiply.y, + object.textureIndex); + + mat4 mvp = environmentData.projectionMatrix * environmentData.viewMatrix * object.modelMatrix; + + gl_Position = mvp * vec4( + inPosition.x, + inPosition.y, + inPosition.z, + 1.); + } + + +Fragment +======== + +.. code:: glsl + + #version 460 + + layout(binding = 0) uniform sampler2DArray samplerArray; + + layout(location = 0) in vec4 inColor; + layout(location = 1) in vec3 inFragTextureCoords; + layout(location = 2) in vec4 playerColor; + + layout(location = 0) out vec4 outFragColor; + + struct GlobalVariable { + int value; + }; + + struct ObjectVariable { + int value; + }; + + struct PlayerInfo { + vec4 playerColor; + }; + + struct ObjectData { + mat4 modelMatrix; + vec4 color; + vec2 textureMultiply; + int textureIndex; + int objectType; + int playerId; + int zIdx; + }; + + layout(std140, binding = 1) uniform EnvironmentData { + mat4 projectionMatrix; + mat4 viewMatrix; + vec2 gridDims; + int playerId; + int globalVariableCount; + int objectVariableCount; + int highlightPlayers; + } + environmentData; + + layout(std430, binding = 3) readonly buffer ObjectDataBuffer { + uint size; + ObjectData variables[]; + } + objectDataBuffer; + + layout(std430, binding = 4) readonly buffer GlobalVariableBuffer { + GlobalVariable variables[]; + } + globalVariableBuffer; + + layout(std430, binding = 5) readonly buffer ObjectVariableBuffer { + ObjectVariable variables[]; + } + objectVariableBuffer; + + int getObjectVariable(in int objectIndex, in int variableIndex, in int numVariables) { + return objectVariableBuffer.variables[objectIndex * numVariables + variableIndex].value; + } + + void main() { + + float lightLevel = 0.0; + for (int i = 0; i < objectDataBuffer.size; i++) { + ObjectData object = objectDataBuffer.variables[i]; + + if (object.objectType == 0 || object.objectType == 1) { + int isLight = getObjectVariable(i, 0, 1); + if (isLight == 1) { + mat4 mv = environmentData.viewMatrix * object.modelMatrix; + vec4 position = mv * vec4(0, 0, 0, 1); + float dist_to_pixel = distance(position.xy, gl_FragCoord.xy); + lightLevel += 1.0/pow(dist_to_pixel / 30.0, 2.0) - 0.1; + } + } + } + + lightLevel = max(0, min(1.0, lightLevel)); + + outFragColor = texture(samplerArray, inFragTextureCoords) * vec4(lightLevel, lightLevel, lightLevel, 1.0); + } + + +***************** +Full Code Example +***************** + +`Full code examples can be found here!`_ \ No newline at end of file diff --git a/docs/tutorials/Custom Shaders/index.rst b/docs/tutorials/Custom Shaders/index.rst new file mode 100644 index 000000000..665f19189 --- /dev/null +++ b/docs/tutorials/Custom Shaders/index.rst @@ -0,0 +1,311 @@ +.. _doc_tutorials_custom_shaders: + +############## +Custom Shaders +############## + +.. raw:: html + +
+ +

Partial Observability using a custom lighting shader. See Example 3.

+
+ +GDY provides an easy way of scripting most game mechanics. But what if you want to do something interesting with the visualization of the environment? + +Griddly achieves high-speed rendering using hardware accelerated `SPIR-V shaders `_. + +Shaders are complicated beasts, but the following tutorials will help to understand how Griddly uses them. We will also show how you can customize them to produce much more visually complex environments. + +This tutorial is not intended to teach how computer graphics pipelines work, you will probably require a basic grasp of several topics. I've included some good resources here that should be helpful: + +`Model View Projection Matrices `_ + +`Shaders Basics `_ (this is based around the Unity engine, but many of the concepts are similar. + +`Healthbars, Signed Distance Fields & Lighting `_ (again around Unity, but we use Signed Distance Fields in Example 2 to make a health bar! + +********************************* +Griddly Graphics Pipeline Basics +********************************* + +Griddly's rendering pipeline uses a single `Vertex Shader` and a single `Fragment Shader`. The entire game state (global variables, object locations, object variable values etc.) is sent to both the vertex and fragment shader. This allows the shader to read the states and render the environment accordingly. + +Griddly has default shaders for both ``SPRITE_2D`` and ``BLOCK_2D`` renderers which are automatically included when you install Griddly. The code for those shaders (specifically for when you use the ``SPRITE_2D``) is shown below: + +Shader Memory Layout +==================== + +The default vertex shader is slightly more complicated than the fragment shader, as we include all of the possible ``uniform buffer objects`` and ``storage buffer objects`` that are accessible from the shader. + +.. note:: All uniforms are available to the vertex and fragment shader. + +We use a **Push Constants** to index the object in the ``ObjectData`` that we are currently rendering on the GPU. Each ObjectData contains all the information of a single object as defined in the GDY, such as ``color``, ``textureIdx``, ``objectType`` and position (``modelMatrix``). We also have a persistent ``EnvironmentData`` object which includes global information about the environment, including the ``playerId`` that the shader is constructing the observation for. We also have access to information about the other players in the ``PlayerInfo`` buffer. (Currently this is limited to the automatically generated ``playerColor``). + +Finally we have the ``ObjectVariableBuffer`` and ``GlobalVariableBuffer`` which contain the data for **object variables** and **global variables** (as defined in the GDY files under the :ref:`Shader options <#/properties/Environment/properties/Observers/properties/Sprite2D/properties/Shader>`). + +The full shader layout is shown below.: + + +.. code:: glsl + + struct GlobalVariable { + int value; + }; + + struct PlayerInfo { + vec4 playerColor; + }; + + struct ObjectData { + mat4 modelMatrix; + vec4 color; + vec2 textureMultiply; + int textureIndex; + int objectType; + int playerId; + int zIdx; + }; + + layout(std140, binding = 1) uniform EnvironmentData { + mat4 projectionMatrix; + mat4 viewMatrix; + vec2 gridDims; + int playerId; + int globalVariableCount; + int objectVariableCount; + int highlightPlayers; + } + environmentData; + + layout(std430, binding = 2) readonly buffer PlayerInfoBuffer { + PlayerInfo variables[]; + } + playerInfoBuffer; + + layout(std430, binding = 3) readonly buffer ObjectDataBuffer { + uint size; + ObjectData variables[]; + } + objectDataBuffer; + + layout(std430, binding = 4) readonly buffer GlobalVariableBuffer { + GlobalVariable variables[]; + } + globalVariableBuffer; + + layout(std430, binding = 5) readonly buffer ObjectVariableBuffer { + ObjectVariable variables[]; + } + objectVariableBuffer; + + layout(push_constant) uniform PushConsts { + int idx; + } + pushConsts; + +Default Vertex Shader +===================== + +The vertex shader is mostly very simple, it takes the object defined by the current ``pushConsts.idx`` and applies the `model view projection` matrix of that object to each vertex. + +The sprite image for the object is stored in a `texture array` indexed by ``object.textureIndex``. This is used to generate the fragment coordinates that are sent through to the fragment shader in the ``outFragTextureCoords`` variable. + +Additionally, in the default vertex shader, we allow players to be highlighted by color. This can be seen in many of the multi-agent and RTS games. The player color is stored in the ``outPlayerColor`` variable, which is also sent to the fragment shader. + +.. code:: glsl + + void main() { + ObjectData object = objectDataBuffer.variables[pushConsts.idx]; + PlayerInfo objectPlayerInfo = playerInfoBuffer.variables[object.playerId - 1]; + + outFragTextureCoords = vec3( + inFragTextureCoords.x * object.textureMultiply.x, + inFragTextureCoords.y * object.textureMultiply.y, + object.textureIndex); + + mat4 mvp = environmentData.projectionMatrix * environmentData.viewMatrix * object.modelMatrix; + + gl_Position = mvp * vec4( + inPosition.x, + inPosition.y, + inPosition.z, + 1.); + + if (environmentData.highlightPlayers == 1) { + if (object.playerId > 0 && object.playerId == environmentData.playerId) { + outPlayerColor = vec4(0.0, 1.0, 0.0, 1.0); + } else { + outPlayerColor = objectPlayerInfo.playerColor; + } + + outHighlightPlayers = 1; + } else { + outHighlightPlayers = 0; + outPlayerColor = vec4(0.0); + } + } + +Default Fragment Shader +======================= + +Most customization for visualization in Griddly environments is undertaken in the fragment shader. + +The default fragment shader samples the color of each pixel from the texture, given the texture coordinates from the vertex shader. + +In this default shader we also keep player highlighting code which adds an outline to the sprite image based on it's transparency. + +.. code:: glsl + + void main() + { + if(highlightPlayers==1){ + // Just multiply by the alpha channel of the object + vec4 color=texture(samplerArray,inFragTextureCoords); + + vec2 tex_dims=vec2(textureSize(samplerArray,0)); + + vec2 pixel_size=2./tex_dims; + + vec4 colorU=texture(samplerArray,vec3(inFragTextureCoords.x,max(pixel_size.y,inFragTextureCoords.y-pixel_size.y),inFragTextureCoords.z)); + vec4 colorD=texture(samplerArray,vec3(inFragTextureCoords.x,min(tex_dims.y,inFragTextureCoords.y+pixel_size.y),inFragTextureCoords.z)); + vec4 colorL=texture(samplerArray,vec3(min(tex_dims.x,inFragTextureCoords.x+pixel_size.x),inFragTextureCoords.y,inFragTextureCoords.z)); + vec4 colorR=texture(samplerArray,vec3(max(0.,inFragTextureCoords.x-pixel_size.x),inFragTextureCoords.y,inFragTextureCoords.z)); + + outFragColor=color; + + float thresh1=.7; + float thresh2=.4; + + if(color.a<=thresh1&&(colorU.a>thresh2||colorD.a>thresh2||colorL.a>thresh2||colorR.a>thresh2)){ + outFragColor=playerColor; + } + + }else{ + outFragColor=texture(samplerArray,inFragTextureCoords); + } + + } + + +.. _customizing_shaders: + +******************** +Customising Shaders +******************** + +In order to customize these shaders, firstly the custom shaders have to be coded and compiled and secondly we have to point Griddly to these compiled shaders. + +To point Griddly to a new shader directory, the ``shader_path`` parameter needs to be supplied in the ``gym.make`` or ``GymWrapper`` function: + +.. code:: python + + env = GymWrapper('object_lighting.yaml', + shader_path='shaders', + player_observer_type=gd.ObserverType.SPRITE_2D, + global_observer_type=gd.ObserverType.SPRITE_2D, + ... + ) + +Compiling shaders with glslc +============================= + +There are many shader languages that can be compiled into the SPIR-V format that Griddly is compatible with. In all the examples, and default shaders we use the GLSL shader language and compile it to SPIR-V using ``glslc`` + +glslc can be obtained by installing the `Vulkan SDK `_ or by forking the `github repo `_ and compiling from scratch. + +Once you have the glslc tool, you can compile the fragment and vertex shaders using the following commands: + +.. code:: bash + + glslc triangle-textured.frag -o $SHADER_OUTPUT_DIR/triangle-textured.frag.spv + glslc triangle-textured.vert -o $SHADER_OUTPUT_DIR/triangle-textured.vert.spv + +.. note:: For SPRITE_2D and ISOMETRIC shaders, the compiled fragment and vertex shaders must be named ``triangle-textured.frag.spv`` and ``triangle-textured.vert.spv``. For BLOCK_2D, the shaders need to be named ``triangle.frag.spv`` and ``triangle.vert.spv``. + +********* +Examples +********* + +.. toctree:: + :hidden: + + Global Lighting/index + Health Bars/index + Object Lighting/index + +.. list-table:: + :class: game-gallery + + * - **Global Lighting** + + .. raw:: html + +
+ +

+
+ + In this tutorial we use the global variable ``_steps`` in the fragment shader to change the lighting level of the entire environment. + + .. list-table:: + + * - :ref:`Go to tutorial ` + - `Go to code `_ + + * - **Heath Bars** + + .. raw:: html + +
+ +

+
+ + In this tutorial we use the ``health`` and ``max_health`` variables that we define in the GDY for each object to create a "health bar" showing the health of the agents as they battle. The heath bars are created in the fragment shader using signed distance fields. + + .. list-table:: + + * - :ref:`Go to tutorial ` + - `Go to code `_ + + + * - **Object Lighting** + + .. raw:: html + +
+ +

+
+ + In this tutorial we use variables that we define in the GDY to create lights around certain objects. Again we used signed distance fields in the fragment shader to create the light effects. + + .. list-table:: + + * - :ref:`Go to tutorial ` + - `Go to code `_ \ No newline at end of file diff --git a/python/examples/AStar search/astar.py b/python/examples/AStar Search/astar.py similarity index 100% rename from python/examples/AStar search/astar.py rename to python/examples/AStar Search/astar.py diff --git a/python/examples/AStar search/astar_opponent_environment.yaml b/python/examples/AStar Search/astar_opponent_environment.yaml similarity index 100% rename from python/examples/AStar search/astar_opponent_environment.yaml rename to python/examples/AStar Search/astar_opponent_environment.yaml diff --git a/python/examples/AStar search/astar_opponent_rotation_actions_environment.yaml b/python/examples/AStar Search/astar_opponent_rotation_actions_environment.yaml similarity index 100% rename from python/examples/AStar search/astar_opponent_rotation_actions_environment.yaml rename to python/examples/AStar Search/astar_opponent_rotation_actions_environment.yaml diff --git a/python/examples/AStar search/output.gif b/python/examples/AStar Search/output.gif similarity index 100% rename from python/examples/AStar search/output.gif rename to python/examples/AStar Search/output.gif diff --git a/python/examples/Custom Shaders/Global Lighting/daynight.png b/python/examples/Custom Shaders/Global Lighting/daynight.png new file mode 100644 index 000000000..07022c363 Binary files /dev/null and b/python/examples/Custom Shaders/Global Lighting/daynight.png differ diff --git a/python/examples/Custom Shaders/Global Lighting/daynight_naive.png b/python/examples/Custom Shaders/Global Lighting/daynight_naive.png new file mode 100644 index 000000000..8db176c1c Binary files /dev/null and b/python/examples/Custom Shaders/Global Lighting/daynight_naive.png differ diff --git a/python/examples/Custom Shaders/Global Lighting/lighting_graphs.py b/python/examples/Custom Shaders/Global Lighting/lighting_graphs.py new file mode 100644 index 000000000..fb9324ac8 --- /dev/null +++ b/python/examples/Custom Shaders/Global Lighting/lighting_graphs.py @@ -0,0 +1,33 @@ +import matplotlib.pyplot as plt +import numpy as np + + +def print_day_night_naive(): + x = np.arange(0, 1000) + y = np.minimum(1, np.cos((np.pi * x) / 360)) + + fig, ax = plt.subplots() + + ax.plot(x, y) + ax.set_title("Day/Night Cycle") + ax.set_xlabel("_steps") + ax.set_ylabel("Light Level") + + fig.savefig("daynight_naive.png") + +def print_day_night_better(): + x = np.arange(0, 1000) + y = np.minimum(1, np.cos((np.pi*x)/360)+1) + + fig, ax = plt.subplots() + + ax.plot(x,y) + ax.set_title("Day/Night Cycle") + ax.set_xlabel("_steps") + ax.set_ylabel("Light Level") + + fig.savefig("daynight.png") + + +print_day_night_naive() +print_day_night_better() diff --git a/python/examples/Custom Shaders/Object Lighting/lighting_graphs.py b/python/examples/Custom Shaders/Object Lighting/lighting_graphs.py new file mode 100644 index 000000000..d98b64978 --- /dev/null +++ b/python/examples/Custom Shaders/Object Lighting/lighting_graphs.py @@ -0,0 +1,38 @@ +import matplotlib.pyplot as plt +import numpy as np + +def distance(a, b): + return np.abs(a-b) + + + +def plot_lighting_distance(light_objects, filename): + + x = np.arange(0, 400) + y = np.zeros(400) + fig, ax = plt.subplots() + + for lo in light_objects: + ax.axvline(x=lo, c='r') + y += 1.0/np.power(distance(lo, x) / 30.0, 2.0) - 0.1 + + y = np.maximum(0,np.minimum(1.0, y)) + + + ax.plot(x, y) + ax.set_title("Object Light Levels") + ax.set_xlabel("Distance") + ax.set_ylabel("Light Level") + + fig.savefig(filename) + + +def print_lighting_single(): + plot_lighting_distance([100.0], "lighting_single.png") + +def print_lighting_multiple(): + plot_lighting_distance([100.0, 300.0], "lighting_multiple.png") + + +print_lighting_single() +print_lighting_multiple() diff --git a/python/examples/Custom Shaders/Object Lighting/lighting_multiple.png b/python/examples/Custom Shaders/Object Lighting/lighting_multiple.png new file mode 100644 index 000000000..081bf9802 Binary files /dev/null and b/python/examples/Custom Shaders/Object Lighting/lighting_multiple.png differ diff --git a/python/examples/Custom Shaders/Object Lighting/lighting_single.png b/python/examples/Custom Shaders/Object Lighting/lighting_single.png new file mode 100644 index 000000000..485b6f6fe Binary files /dev/null and b/python/examples/Custom Shaders/Object Lighting/lighting_single.png differ diff --git a/python/examples/Custom Shaders/Object Lighting/reset_global.png b/python/examples/Custom Shaders/Object Lighting/reset_global.png index c44fb18ea..893cfbf47 100644 Binary files a/python/examples/Custom Shaders/Object Lighting/reset_global.png and b/python/examples/Custom Shaders/Object Lighting/reset_global.png differ diff --git a/python/examples/Custom Shaders/Object Lighting/reset_partial.png b/python/examples/Custom Shaders/Object Lighting/reset_partial.png index 1cf6dba23..586f06afa 100644 Binary files a/python/examples/Custom Shaders/Object Lighting/reset_partial.png and b/python/examples/Custom Shaders/Object Lighting/reset_partial.png differ diff --git a/python/examples/Custom Shaders/Object Lighting/shaders/triangle-textured.frag b/python/examples/Custom Shaders/Object Lighting/shaders/triangle-textured.frag index 31c0c9e1d..f0008c154 100644 --- a/python/examples/Custom Shaders/Object Lighting/shaders/triangle-textured.frag +++ b/python/examples/Custom Shaders/Object Lighting/shaders/triangle-textured.frag @@ -41,11 +41,6 @@ layout(std140, binding = 1) uniform EnvironmentData { } environmentData; -layout(std430, binding = 2) readonly buffer PlayerInfoBuffer { - PlayerInfo variables[]; -} -playerInfoBuffer; - layout(std430, binding = 3) readonly buffer ObjectDataBuffer { uint size; ObjectData variables[]; @@ -66,25 +61,24 @@ int getObjectVariable(in int objectIndex, in int variableIndex, in int numVariab return objectVariableBuffer.variables[objectIndex * numVariables + variableIndex].value; } -const float minLight = 0.0; void main() { - float lightLevel = minLight; - // Definitely not the most efficient method because we are comparing every pixel with every object position... + + float lightLevel = 0.0; for (int i = 0; i < objectDataBuffer.size; i++) { ObjectData object = objectDataBuffer.variables[i]; - // the avatar and the - if (object.objectType == 2 || object.objectType == 1) { + if (object.objectType == 0 || object.objectType == 1) { int isLight = getObjectVariable(i, 0, 1); if (isLight == 1) { mat4 mv = environmentData.viewMatrix * object.modelMatrix; vec4 position = mv * vec4(0, 0, 0, 1); - float newLightLevel = 1.0 - clamp(pow(distance(position.xy, gl_FragCoord.xy) / 50.0, 2), 0.0, 1 - minLight); - // float newLightLevel = 1.0 - max(1.0, distance(vec4(0.5,0.5,0.0,0.0), gl_FragCoord)); - lightLevel = max(newLightLevel, lightLevel); + float dist_to_pixel = distance(position.xy, gl_FragCoord.xy); + lightLevel += 1.0/pow(dist_to_pixel / 30.0, 2.0) - 0.1; } } } + lightLevel = max(0, min(1.0, lightLevel)); + outFragColor = texture(samplerArray, inFragTextureCoords) * vec4(lightLevel, lightLevel, lightLevel, 1.0); } \ No newline at end of file diff --git a/python/examples/Custom Shaders/Object Lighting/shaders/triangle-textured.vert b/python/examples/Custom Shaders/Object Lighting/shaders/triangle-textured.vert index b0478fdd0..bc249c884 100644 --- a/python/examples/Custom Shaders/Object Lighting/shaders/triangle-textured.vert +++ b/python/examples/Custom Shaders/Object Lighting/shaders/triangle-textured.vert @@ -11,18 +11,6 @@ out gl_PerVertex { vec4 gl_Position; }; -struct GlobalVariable { - int value; -}; - -struct ObjectVariable { - int value; -}; - -struct PlayerInfo { - vec4 playerColor; -}; - struct ObjectData { mat4 modelMatrix; vec4 color; @@ -44,27 +32,12 @@ layout(std140, binding = 1) uniform EnvironmentData { } environmentData; -layout(std430, binding = 2) readonly buffer PlayerInfoBuffer { - PlayerInfo variables[]; -} -playerInfoBuffer; - layout(std430, binding = 3) readonly buffer ObjectDataBuffer { uint size; ObjectData variables[]; } objectDataBuffer; -layout(std430, binding = 4) readonly buffer GlobalVariableBuffer { - GlobalVariable variables[]; -} -globalVariableBuffer; - -layout(std430, binding = 5) readonly buffer ObjectVariableBuffer { - ObjectVariable variables[]; -} -objectVariableBuffer; - layout(push_constant) uniform PushConsts { int idx; } diff --git a/python/setup.py b/python/setup.py index c379d3404..a8cc73a8e 100644 --- a/python/setup.py +++ b/python/setup.py @@ -71,7 +71,7 @@ def griddly_package_data(config='Debug'): setup( name='griddly', - version="1.2.23", + version="1.2.24", author_email="chrisbam4d@gmail.com", description="Griddly Python Libraries", long_description=long_description,