diff --git a/.github/workflows/Emscripten.yml b/.github/workflows/Emscripten.yml index be4746ad8..30a3462b4 100644 --- a/.github/workflows/Emscripten.yml +++ b/.github/workflows/Emscripten.yml @@ -21,6 +21,12 @@ jobs: steps: - uses: actions/checkout@v3 + - name: Checkout Examples + uses: actions/checkout@v3 + with: + repository: 32blit/32blit-examples + path: 32blit-examples + - name: Install deps run: | sudo apt update && sudo apt install doxygen graphviz python3-setuptools @@ -50,7 +56,7 @@ jobs: - name: Configure CMake shell: bash working-directory: ${{runner.workspace}}/build - run: emcmake cmake $GITHUB_WORKSPACE -D32BLIT_DIR=$GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_CXX_FLAGS_RELEASE="-O2 -DNDEBUG" + run: emcmake cmake $GITHUB_WORKSPACE/32blit-examples -D32BLIT_DIR=$GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_CXX_FLAGS_RELEASE="-O2 -DNDEBUG" # Problem matching - uses: ammaraskar/gcc-problem-matcher@master diff --git a/.github/workflows/Visual Studio.yml b/.github/workflows/Visual Studio.yml deleted file mode 100644 index 48204bc75..000000000 --- a/.github/workflows/Visual Studio.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Visual Studio (.sln) -on: - push: - branches: - - '**' # only run on branches - pull_request: - -jobs: - build: - runs-on: windows-latest - - steps: - - uses: actions/checkout@v3 - - - name: Install deps - shell: bash - run: | - ci/install_sdl_vs.sh - python -m pip install 32blit - - - name: Add msbuild to PATH - uses: microsoft/setup-msbuild@v1.1.3 - - - name: Build - run: msbuild.exe vs/32blit.sln diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 1ebfb12d4..e345ff9fd 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -21,7 +21,7 @@ jobs: - os: ubuntu-20.04 name: Linux cache-key: linux - release-suffix: LIN64 + artifact-suffix: LIN64 cmake-args: '"-DCMAKE_CXX_CLANG_TIDY=clang-tidy;-header-filter=(32blit|32blit-sdl)/;-checks=performance-*,portability-*,modernize-*,-modernize-use-trailing-return-type,-modernize-avoid-c-arrays,-modernize-use-nodiscard" -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache' apt-packages: ccache clang-tidy libsdl2-dev libsdl2-image-dev libsdl2-net-dev python3-setuptools @@ -36,8 +36,8 @@ jobs: pico-sdk: true name: PicoSystem cache-key: picosystem - release-suffix: PicoSystem - cmake-args: -D32BLIT_DIR=$GITHUB_WORKSPACE -DPICO_SDK_PATH=$GITHUB_WORKSPACE/pico-sdk -DPICO_BOARD=pimoroni_picosystem -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache + artifact-suffix: PicoSystem + cmake-args: -DCMAKE_TOOLCHAIN_FILE=$GITHUB_WORKSPACE/pico.toolchain -DPICO_SDK_PATH=$GITHUB_WORKSPACE/pico-sdk -DPICO_BOARD=pimoroni_picosystem -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache apt-packages: ccache gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib python3-setuptools - os: ubuntu-20.04 @@ -56,7 +56,7 @@ jobs: - os: windows-latest name: Visual Studio cache-key: windows - release-suffix: WIN64 + artifact-suffix: WIN64 cmake-args: -DSDL2_DIR=$GITHUB_WORKSPACE/vs/sdl runs-on: ${{matrix.os}} @@ -68,6 +68,12 @@ jobs: - name: Checkout 32Blit SDK uses: actions/checkout@v3 + - name: Checkout Examples + uses: actions/checkout@v3 + with: + repository: 32blit/32blit-examples + path: 32blit-examples + # pico sdk/extras for some builds - name: Checkout Pico SDK if: matrix.pico-sdk @@ -121,7 +127,9 @@ jobs: run: ci/install_sdl_mingw.sh - name: Create Build Environment - run: cmake -E make_directory ${{runner.workspace}}/build + run: | + cmake -E make_directory ${{runner.workspace}}/build + cmake -E make_directory ${{runner.workspace}}/build-examples - name: Set Tag Variable if: github.event_name == 'release' @@ -149,19 +157,25 @@ jobs: cmake --build . --config $BUILD_TYPE -j 2 ccache --show-stats || true - #- name: Test - # working-directory: ${{runner.workspace}}/build - # shell: bash - # Execute tests defined by the CMake configuration. - # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail - # run: ctest -C $BUILD_TYPE + - name: Configure Examples + shell: bash + working-directory: ${{runner.workspace}}/build-examples + # installs into same dir as SDK + run: cmake $GITHUB_WORKSPACE/32blit-examples -D32BLIT_DIR=$GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX=$RUNNER_WORKSPACE/build/install -DCPACK_PACKAGE_FILE_NAME=${{env.RELEASE_FILE}} ${{matrix.cmake-args}} + + - name: Build Examples + working-directory: ${{runner.workspace}}/build-examples + shell: bash + run: | + cmake --build . --config $BUILD_TYPE -j 2 + ccache --show-stats || true - name: Prepare Artifact if: github.event_name != 'release' - working-directory: ${{runner.workspace}}/build shell: bash run: | - cmake --build . --config $BUILD_TYPE --target install + cmake --build $RUNNER_WORKSPACE/build --config $BUILD_TYPE --target install + cmake --build $RUNNER_WORKSPACE/build-examples --config $BUILD_TYPE --target install - name: Upload Artifact if: github.event_name != 'release' diff --git a/CMakeLists.txt b/CMakeLists.txt index 7c04782ca..37fbdcd1e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,7 +12,7 @@ else() endif() find_package (32BLIT CONFIG REQUIRED PATHS .) -add_subdirectory(examples) +add_subdirectory(utilities) add_subdirectory(launcher-shared) diff --git a/README.md b/README.md index 06263657d..a3710906a 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ The `32blit-stm32` directory contains the STM32 HAL for 32blit, compatible with ## Examples / Projects -The `examples` directory contains example projects, these can be built into both SDL or STM32 binaries and cover a range of techniques from simple concepts to complete games. +Examples can be found at https://github.com/32blit/32blit-examples/, these can be built into both SDL or STM32 binaries and cover a range of techniques from simple concepts to complete games. Refer to the OS/platform specific documentation files in the `docs/` folder for instructions on how to compile and run these examples. diff --git a/assets/README.md b/assets/README.md deleted file mode 100644 index 5bc6bac18..000000000 --- a/assets/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# 32Blit Assets - -## Artists - -### Sam (@s4m_ur4i) - -Our Space Shooter, Platformer, Dingbads, Pirates and Top Down Shooter spritesheets have been lovingly crafted by Sam. - -You can find him and his work at: - -* https://s4m-ur4i.itch.io/ -* https://samvieten.com/ -* https://twitter.com/s4m_ur4 \ No newline at end of file diff --git a/assets/gadgetoid_raycaster.png b/assets/gadgetoid_raycaster.png deleted file mode 100644 index 9cdc279d9..000000000 Binary files a/assets/gadgetoid_raycaster.png and /dev/null differ diff --git a/assets/platformer.tmx b/assets/platformer.tmx deleted file mode 100644 index ac2dcbce0..000000000 --- a/assets/platformer.tmx +++ /dev/null @@ -1,144 +0,0 @@ - - - - - -18,18,18,18,18,18,18,18,18,18,18,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48, -18,18,18,18,18,18,18,18,18,18,18,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48, -18,18,18,18,18,18,18,18,18,18,18,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,48, -2,3,4,5,2,3,4,2,3,4,5,6,3,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48, -0,0,0,0,0,0,0,52,0,0,0,14,15,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,32,69,48,0,0,0,31,0,0,0,0,16,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,7,0,32,85,48,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,32,68,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,23,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,84,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,42,0,0,0,0,0,0,42,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0, -0,0,0,0,0,16,0,79,0,0,0,0,0,0,0,0,16,0,0,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,42,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -16,16,16,16,16,16,42,16,16,16,42,16,42,16,16,16,42,0,0,0,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -16,42,16,42,16,16,16,16,42,16,16,16,16,16,61,16,16,0,0,0,16,42,42,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -16,16,61,16,16,16,16,16,42,16,16,42,16,16,16,42,16,42,42,16,16,16,16,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -42,16,16,16,42,16,14,16,16,42,16,16,42,16,42,16,16,16,16,42,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -16,16,42,16,16,42,16,16,16,42,42,16,16,16,16,16,31,16,16,16,42,16,61,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -16,16,16,16,16,16,42,16,16,16,61,16,16,42,16,16,16,16,42,16,42,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - - - - -0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,0,75,29,30,61,0,0,0,0,0,0,61,29,30,0,0,16,0,0,0,0,0,0,0,0,0,0,29,30,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,0,75,45,46,0,0,0,0,0,0,0,0,45,46,0,0,0,0,16,0,0,0,0,16,0,0,0,45,46,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,0,75,0,0,0,0,0,0,0,0,0,0,61,90,90,90,90,72,0,0,0,0,0,0,0,0,0,75,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,90,91,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,29,30,0,0,0,0,0,16,0,75,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,46,0,0,16,0,0,0,0,75,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,122,29,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,72,0,0,0,0,0,0,75,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,61,45,46,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,90,90,90,90,90,72,75,0,0,0,0,0, -0,0,0,0,0,0,61,58,58,88,0,0,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,61,75,0,0,0,57,58, -0,0,0,0,57,58,88,0,0,0,0,0,87,58,58,58,58,29,30,58,61,58,58,58,51,56,56,56,56,49,58,58,58,61,0,0,0,0,0,0,0,29,30,56,56,56,65,0, -59,8,58,61,73,0,0,0,0,76,95,95,95,95,95,95,77,45,46,0,0,0,0,0,67,17,17,49,50,128,0,0,29,30,61,0,0,0,0,0,0,45,46,17,17,17,65,0, -75,8,0,0,73,0,0,0,0,80,0,0,0,0,0,0,78,0,76,95,95,95,95,77,127,50,50,128,0,0,0,0,45,46,67,56,56,56,56,56,56,61,17,17,17,17,65,0, -75,8,0,0,94,95,95,95,95,96,0,0,0,0,0,0,94,95,96,0,0,0,0,48,0,0,0,0,0,0,0,0,0,0,67,17,17,17,17,17,17,17,17,17,17,17,65,0, -75,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,0,0,0,0,0,0,0,0,0,0,127,50,50,50,51,17,17,17,17,17,17,49,128,0, -32,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67,17,17,17,17,17,49,128,0,0, -32,8,0,0,0,0,0,0,0,0,41,62,63,63,64,0,0,0,0,0,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,50,50,50,50,50,128,0,0,0, -92,63,63,63,63,63,63,63,63,63,63,93,0,0,92,63,63,64,0,62,63,63,63,93,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,0,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,60,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - - - - -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,33,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,33,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,38,0,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,53,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - - - - -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,193,0,0,0,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,209,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - - - - -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,85, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,13,0,40,0,0,0,0,0,0,0,0,69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,0,0,0,0,0,0, -0,0,0,0,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,85,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - - - diff --git a/assets/platformer.tsx b/assets/platformer.tsx deleted file mode 100644 index 8ea70bcea..000000000 --- a/assets/platformer.tsx +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/assets/s4m_ur4i-dingbads.png b/assets/s4m_ur4i-dingbads.png deleted file mode 100644 index 075698bfc..000000000 Binary files a/assets/s4m_ur4i-dingbads.png and /dev/null differ diff --git a/assets/s4m_ur4i-pirate-characters.png b/assets/s4m_ur4i-pirate-characters.png deleted file mode 100644 index de7bbf630..000000000 Binary files a/assets/s4m_ur4i-pirate-characters.png and /dev/null differ diff --git a/assets/s4m_ur4i-pirate-tilemap.png b/assets/s4m_ur4i-pirate-tilemap.png deleted file mode 100644 index 0777d355e..000000000 Binary files a/assets/s4m_ur4i-pirate-tilemap.png and /dev/null differ diff --git a/assets/s4m_ur4i-platformer.png b/assets/s4m_ur4i-platformer.png deleted file mode 100644 index 0589c6761..000000000 Binary files a/assets/s4m_ur4i-platformer.png and /dev/null differ diff --git a/assets/s4m_ur4i-space-shooter-backdrop-palette.png b/assets/s4m_ur4i-space-shooter-backdrop-palette.png deleted file mode 100644 index a22f09ddd..000000000 Binary files a/assets/s4m_ur4i-space-shooter-backdrop-palette.png and /dev/null differ diff --git a/assets/s4m_ur4i-space-shooter-backdrop.png b/assets/s4m_ur4i-space-shooter-backdrop.png deleted file mode 100644 index 692274a3a..000000000 Binary files a/assets/s4m_ur4i-space-shooter-backdrop.png and /dev/null differ diff --git a/assets/s4m_ur4i-space-shooter-ships.png b/assets/s4m_ur4i-space-shooter-ships.png deleted file mode 100644 index befd14b01..000000000 Binary files a/assets/s4m_ur4i-space-shooter-ships.png and /dev/null differ diff --git a/assets/s4m_ur4i-top-down-shooter.png b/assets/s4m_ur4i-top-down-shooter.png deleted file mode 100644 index c363d5a7a..000000000 Binary files a/assets/s4m_ur4i-top-down-shooter.png and /dev/null differ diff --git a/assets/tilemap-test.tmx b/assets/tilemap-test.tmx deleted file mode 100644 index bcb048a0f..000000000 --- a/assets/tilemap-test.tmx +++ /dev/null @@ -1,72 +0,0 @@ - - - - - -18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, -18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, -18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, -18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, -18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, -18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, -18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, -18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, -18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,61,29,30,61,45,46,1,1,61,29,30,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, -18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,61,45,46,61,44,1,1,1,1,45,46,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, -18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,29,30,44,1,1,1,1,1,1,61,73,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, -2,3,4,5,6,2,3,4,5,6,2,3,4,5,6,2,3,4,5,6,2,3,2,2,3,4,5,6,45,46,1,1,1,1,1,1,1,42,73,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,42,1,1,1,1,1,1,1,1,1,73,2,3,4,5,6,2,3,4,5,6,2,3,4,5,6,2,3,4,5,6,2,3,2,2,3, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,14,15,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,73,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,29,30,31,1,86,1,23,1,1,1,1,1,1,1,1,1,1,16,1,1,1,1,1,73,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,61,9,45,46,61,9,9,9,61,1,1,1,1,1,1,1,1,1,1,1,1,1,52,1,1,73,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,43,44,1,1,1,1,42,1,1,1,1,1,14,15,16,1,1,1,1,32,68,48,1,73,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,57,58,59,31,1,1,1,1,1,32,84,48,1,73,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,73,1,75,47,1,1,1,41,57,58,58,59,1,73,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,29,30,58,58,58,58,58,8,58,58,58,58,58,58,59,8,57,58,59,1,1,73,1,87,58,58,58,58,58,88,1,1,87,58,88,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,45,46,1,1,1,1,1,8,1,1,1,1,1,74,75,8,73,1,67,1,1,65,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,8,1,1,1,1,1,1,75,8,73,1,127,50,50,128,1,71,90,90,90,90,72,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,75,8,73,1,1,1,1,1,1,75,1,1,1,1,73,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,75,8,89,90,90,90,90,90,90,91,1,1,1,1,73,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,32,8,1,1,161,1,1,10,1,42,1,1,1,1,89,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,28,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,32,8,1,1,177,1,1,10,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,78,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,32,8,1,1,1,1,1,10,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,78,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,32,8,1,1,1,1,1,10,1,1,16,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,14,15,1,1,1,7,1,1,78,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,32,8,1,1,1,1,1,10,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,29,30,31,1,86,1,23,1,1,78,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,92,63,63,63,63,63,63,64,1,1,1,1,1,16,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,61,9,45,46,61,9,9,9,61,1,1,78,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,80,1,1,1,1,1,1,1,1,1,1,1,1,16,1,1,1,1,1,1,1,1,1,1,1,1,1,43,44,1,1,1,1,42,1,16,78,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,80,16,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,78,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,80,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,78,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,92,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,93,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,55,8,72,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,74,75,8,73,74,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,55,90,91,8,89,90,72,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,75,128,1,1,1,127,73,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,75,1,39,1,39,1,73,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,75,1,1,1,1,1,73,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,75,112,1,26,1,111,73,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,87,58,58,58,58,58,88,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 - - - diff --git a/assets/wasp_raycaster.png b/assets/wasp_raycaster.png deleted file mode 100644 index 820268b4e..000000000 Binary files a/assets/wasp_raycaster.png and /dev/null differ diff --git a/docs/32blit.md b/docs/32blit.md index 1771caaab..8cc1029e2 100644 --- a/docs/32blit.md +++ b/docs/32blit.md @@ -36,13 +36,21 @@ You should also make sure you have a cross-compile environment set up on your co To build an example for 32blit using `arm-none-eabi-gcc` you must prepare the Makefile with CMake using the provided toolchain file. -From the root of the repository: +Clone the examples repository: +``` +git clone https://github.com/32blit/32blit-examples + +cd 32blit-examples +``` + +From the root of the examples repository: ``` mkdir build.stm32 cd build.stm32 -cmake .. -DCMAKE_TOOLCHAIN_FILE=../32blit.toolchain +cmake .. -DCMAKE_TOOLCHAIN_FILE=../../32blit-sdk/32blit.toolchain ``` +(Assuming 32blit-sdk is cloned next to 32blit-examples) And then run `make examplename` to build an example. @@ -122,7 +130,7 @@ You can either press Menu and select "Exit Game" or long-press Menu to exit. ### Flasher Can't Find 32Blit Port -If `make example.flash` fails with `Unable to find 32Blit`, re-run `cmake` with `-DFLASH_PORT=[PORT PATH]`. +If `make example.flash` fails with `Unable to find 32Blit`, re-run `cmake` with `-DFLASH_PORT=[PORT PATH]`. Port-detection does not work if your device is in DFU mode. Either reset it to get it out, or it it's stuck in DFU mode (or just boots into a black screen), you may need to reflash the firmware. diff --git a/docs/Linux.md b/docs/Linux.md index f869a054b..e60f3932e 100644 --- a/docs/Linux.md +++ b/docs/Linux.md @@ -45,13 +45,22 @@ If you want to run code on 32Blit, you should now refer to [Building & Running O ## Building & Running Locally + +Clone the examples repository: +``` +git clone https://github.com/32blit/32blit-examples + +cd 32blit-examples +``` + Set up the 32Blit Makefile from the root of the repository with the following commands: ```shell mkdir build cd build -cmake .. +cmake -D32BLIT_DIR=../../32blit-sdk .. ``` +(Assuming 32blit-sdk is cloned next to 32blit-examples) Now to make any example, type: diff --git a/docs/Windows-VisualStudio.md b/docs/Windows-VisualStudio.md index 5634cce71..fd61ce5f7 100644 --- a/docs/Windows-VisualStudio.md +++ b/docs/Windows-VisualStudio.md @@ -5,9 +5,8 @@ You can use Visual Studio 2019 to examine the samples (compile them and run them See [Building & Running On 32Blit](32blit.md) if you want to compile examples/projects to run on 32Blit. - [Requirements](#requirements) -- [Option 1: Use the solution file](#option-1-use-the-solution-file) +- [Building with Visual Studio's built-in CMake support](#building-with-visual-studios-built-in-cmake-support) - [Get started with your own game](#get-started-with-your-own-game) -- [Option 2: Use Visual Studio's built-in CMake support](#option-2-use-visual-studios-built-in-cmake-support) - [Building your own game](#building-your-own-game) - [Building for 32Blit](#building-for-32blit) - [Troubleshooting](#troubleshooting) @@ -22,20 +21,7 @@ You will also need to download SDL2 development libraries from the [SDL releases Place these in the `vs\sdl\` folder. You will need to merge the include/lib directories. If you are using CMake/Open Folder, these are downloaded automatically. - -There are two methods of building with Visual Studio: - -## Option 1: Use the solution file - -This should be the most familiar option for existing Visual Studio users. - -The solutions and projects are made to use toolset version c142. - -The solution file is located at `vs\32blit.sln`. It contains two static linked libraries, _32blit_ and _32blit-sdl_ and all the examples that will compile to .EXE. - -## Option 2: Use Visual Studio's built-in CMake support - -This has the advantage of being closer to the build for the device. +## Building with Visual Studio's built-in CMake support 1. Open Visual Studio diff --git a/docs/Windows-WSL.md b/docs/Windows-WSL.md index 7860f3f42..d1b44ad46 100644 --- a/docs/Windows-WSL.md +++ b/docs/Windows-WSL.md @@ -84,7 +84,7 @@ sudo mkdir -p /opt/local/ Grab and install the SDL2 mingw development package: ```shell -wget https://github.com/libsdl-org/SDL/releases/download/release-2.24.0/SDL2-devel-2.24.0-mingw.tar.gz +wget https://github.com/libsdl-org/SDL/releases/download/release-2.24.0/SDL2-devel-2.24.0-mingw.tar.gz tar xzf SDL2-devel-2.24.0-mingw.tar.gz sudo cp -r SDL2-2.24.0/x86_64-w64-mingw32 /opt/local/ ``` @@ -111,13 +111,21 @@ sudo cp -r SDL2_net-2.2.0/x86_64-w64-mingw32 /opt/local/ ### Building +Clone the examples repository: +``` +git clone https://github.com/32blit/32blit-examples + +cd 32blit-examples +``` + Finally, set up the 32Blit Makefile from the root of the repository with the following commands: ```shell mkdir build.mingw cd build.mingw -cmake .. -DCMAKE_TOOLCHAIN_FILE=../mingw.toolchain +cmake .. -DCMAKE_TOOLCHAIN_FILE=../../32blit-sdk/mingw.toolchain ``` +(Assuming 32blit-sdk is cloned next to 32blit-examples) #### Single Example diff --git a/docs/Windows.md b/docs/Windows.md index 609ce7245..ff35d764a 100644 --- a/docs/Windows.md +++ b/docs/Windows.md @@ -4,8 +4,8 @@ These instructions cover building 32blit on Windows (without WSL). - [Prerequisites](#prerequisites) - [Using Visual Studio](#using-visual-studio) -- [Building & Running on 32Blit](#building--running-on-32blit) -- [Building & Running Locally](#building--running-locally) +- [Building \& Running on 32Blit](#building--running-on-32blit) +- [Building \& Running Locally](#building--running-locally) - [Build Everything](#build-everything) ## Prerequisites @@ -46,13 +46,21 @@ nmake ## Building & Running Locally +Clone the examples repository: +``` +git clone https://github.com/32blit/32blit-examples + +cd 32blit-examples +``` + Set up the 32Blit Makefile from the root of the repository with the following commands: ```shell mkdir build cd build -cmake -G"NMake Makefiles" .. +cmake -G"NMake Makefiles" -D32BLIT_DIR=../../32blit-sdk .. ``` +(Assuming 32blit-sdk is cloned next to 32blit-examples) Now to make any example, type: diff --git a/docs/macOS.md b/docs/macOS.md index 59c92e59f..9c55ce544 100644 --- a/docs/macOS.md +++ b/docs/macOS.md @@ -6,9 +6,10 @@ These instructions cover building 32blit on macOS. - [Python3](#python3) - [Installing python3](#installing-python3) - [Installing pip3 dependecies](#installing-pip3-dependecies) + - [Verifying install](#verifying-install) - [Installing `gcc-arm-none-eabi`](#installing-gcc-arm-none-eabi) -- [Building & Running on 32Blit](#building--running-on-32blit) -- [Building & Running Locally](#building--running-locally) +- [Building \& Running on 32Blit](#building--running-on-32blit) +- [Building \& Running Locally](#building--running-locally) - [Build Everything](#build-everything) - [Troubleshooting](#troubleshooting) @@ -87,13 +88,21 @@ You'll need to install `SDL2`, `SDL2 Image` and `SDL2 Net` brew install sdl2 sdl2_image sdl2_net ``` +Clone the examples repository: +``` +git clone https://github.com/32blit/32blit-examples + +cd 32blit-examples +``` + Then, set up the 32Blit Makefile from the root of the repository with the following commands: ```shell mkdir build cd build -cmake .. +cmake -D32BLIT_DIR=../../32blit-sdk .. ``` +(Assuming 32blit-sdk is cloned next to 32blit-examples) Now to make any example, type: diff --git a/docs/pico.md b/docs/pico.md index bb8baba42..62d29013c 100644 --- a/docs/pico.md +++ b/docs/pico.md @@ -5,7 +5,7 @@ The Pico port brings the 32blit SDK to PicoSystem and other RP2040-based devices Since RP2040 is slower and less capable than 32blit's STM32H750 there are some limitations, but most of the 32blit SDK conceniences work well. - [Why use 32blit SDK on PicoSystem?](#why-use-32blit-sdk-on-picosystem) -- [Building The SDK & Examples](#building-the-sdk--examples) +- [Building The SDK \& Examples](#building-the-sdk--examples) - [Fetch Pico SDK Automatically (Quick-Start)](#fetch-pico-sdk-automatically-quick-start) - [Existing Pico SDK (Advanced)](#existing-pico-sdk-advanced) - [Starting Your Own 32blit SDK Project](#starting-your-own-32blit-sdk-project) @@ -13,7 +13,7 @@ Since RP2040 is slower and less capable than 32blit's STM32H750 there are some l - [Building](#building) - [Copying to your PicoSystem](#copying-to-your-picosystem) - [Extra configuration](#extra-configuration) -- [API Limitations & Board Details](#api-limitations--board-details) +- [API Limitations \& Board Details](#api-limitations--board-details) - [Unsupported Features](#unsupported-features) - [Limitations](#limitations) - [Board-specific details](#board-specific-details) @@ -73,10 +73,12 @@ You can use Pico SDK's fetch-from-git feature and build like so: ``` git clone https://github.com/32blit/32blit-sdk -cd 32blit-sdk +git clone https://github.com/32blit/32blit-examples + +cd 32blit-examples mkdir build.pico cd build.pico -cmake .. -D32BLIT_DIR=`pwd`/.. -DPICO_SDK_FETCH_FROM_GIT=true -DPICO_EXTRAS_FETCH_FROM_GIT=true -DPICO_BOARD=pimoroni_picosystem +cmake .. -D32BLIT_DIR=`pwd`/../../32blit-sdk -DPICO_SDK_FETCH_FROM_GIT=true -DPICO_EXTRAS_FETCH_FROM_GIT=true -DPICO_BOARD=pimoroni_picosystem ``` And then run `make` as usual. @@ -93,10 +95,12 @@ To build the examples for a PicoSystem: ``` git clone https://github.com/32blit/32blit-sdk -cd 32blit-sdk +git clone https://github.com/32blit/32blit-examples + +cd 32blit-examples mkdir build.pico cd build.pico -cmake .. -D32BLIT_DIR=`pwd`/.. -DPICO_SDK_PATH=/path/to/pico-sdk -DPICO_BOARD=pimoroni_picosystem +cmake .. -D32BLIT_DIR=`pwd`/../../32blit-sdk -DPICO_SDK_PATH=/path/to/pico-sdk -DPICO_BOARD=pimoroni_picosystem ``` And then run `make` as usual. diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt deleted file mode 100644 index 9b542c769..000000000 --- a/examples/CMakeLists.txt +++ /dev/null @@ -1,39 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (examples) -find_package (32BLIT CONFIG REQUIRED PATHS ..) -add_subdirectory(audio-test) -add_subdirectory(audio-wave) -add_subdirectory(doom-fire) -add_subdirectory(fizzlefade) -add_subdirectory(flight) -add_subdirectory(geometry) -add_subdirectory(hardware-test) -add_subdirectory(picosystem-hardware-test) -add_subdirectory(jpeg) -add_subdirectory(logo) -add_subdirectory(matrix-test) -add_subdirectory(metadata-test) -add_subdirectory(mp3) -add_subdirectory(multiplayer) -add_subdirectory(palette-cycle) -add_subdirectory(palette-swap) -add_subdirectory(particle) -add_subdirectory(piano) -add_subdirectory(platformer) -add_subdirectory(profiler-test) -add_subdirectory(raycaster) -add_subdirectory(rotozoom) -add_subdirectory(saves) -add_subdirectory(scrolly-tile) -add_subdirectory(serial-debug) -add_subdirectory(shmup) -add_subdirectory(sprite-test) -add_subdirectory(text) -add_subdirectory(tilemap-test) -add_subdirectory(tilt) -add_subdirectory(timer-test) -add_subdirectory(tunnel) -add_subdirectory(tween-demo) -add_subdirectory(tween-test) -add_subdirectory(voxel) -add_subdirectory(waveform-demo) diff --git a/examples/audio-test/CMakeLists.txt b/examples/audio-test/CMakeLists.txt deleted file mode 100644 index cea302834..000000000 --- a/examples/audio-test/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (audio-test) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (audio-test audio-test.cpp) -blit_metadata (audio-test metadata.yml) \ No newline at end of file diff --git a/examples/audio-test/audio-test.cpp b/examples/audio-test/audio-test.cpp deleted file mode 100644 index bd6dd9c7f..000000000 --- a/examples/audio-test/audio-test.cpp +++ /dev/null @@ -1,138 +0,0 @@ -#include -#include -#include -#include - -#include "audio-test.hpp" - -using namespace blit; - -#define HAT 20000 -#define BASS 500 -#define SNARE 6000 -#define SUB 50 - -// Gadgetoid's amazing masterpiece! -const int16_t notes[5][384] = { - { // melody notes - 147, 0, 0, 0, 0, 0, 0, 0, 175, 0, 196, 0, 220, 0, 262, 0, 247, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 175, 0, 196, 0, 220, 0, 262, 0, 330, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 349, 0, 0, 0, 0, 0, 0, 0, 349, 0, 330, 0, 294, 0, 220, 0, 262, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 247, 0, 0, 0, 0, 0, 0, 0, 247, 0, 220, 0, 196, 0, 147, 0, 175, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, - 147, 0, 0, 0, 0, 0, 0, 0, 175, 0, 196, 0, 220, 0, 262, 0, 247, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 175, 0, 196, 0, 220, 0, 262, 0, 330, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 349, 0, 0, 0, 0, 0, 0, 0, 349, 0, 330, 0, 294, 0, 220, 0, 262, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 247, 0, 0, 0, 0, 0, 0, 0, 247, 0, 220, 0, 196, 0, 147, 0, 175, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, - 147, 0, 0, 0, 0, 0, 0, 0, 175, 0, 196, 0, 220, 0, 262, 0, 247, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 175, 0, 196, 0, 220, 0, 262, 0, 330, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 349, 0, 0, 0, 0, 0, 0, 0, 349, 0, 330, 0, 294, 0, 220, 0, 262, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 247, 0, 0, 0, 0, 0, 0, 0, 247, 0, 262, 0, 294, 0, 392, 0, 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { // rhythm notes - 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 392, 0, 523, 0, 659, 0, 523, 0, 392, 0, 523, 0, 659, 0, 523, 0, 698, 0, 587, 0, 440, 0, 587, 0, 698, 0, 587, 0, 440, 0, 587, 0, 523, 0, 440, 0, 330, 0, 440, 0, 523, 0, 440, 0, 330, 0, 440, 0, 349, 0, 294, 0, 220, 0, 294, 0, 349, 0, 294, 0, 220, 0, 294, 0, 262, 0, 247, 0, 220, 0, 175, 0, 165, 0, 147, 0, 131, 0, 98, 0, - 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 392, 0, 523, 0, 659, 0, 523, 0, 392, 0, 523, 0, 659, 0, 523, 0, 698, 0, 587, 0, 440, 0, 587, 0, 698, 0, 587, 0, 440, 0, 587, 0, 523, 0, 440, 0, 330, 0, 440, 0, 523, 0, 440, 0, 330, 0, 440, 0, 349, 0, 294, 0, 220, 0, 294, 0, 349, 0, 294, 0, 220, 0, 294, 0, 262, 0, 247, 0, 220, 0, 175, 0, 165, 0, 147, 0, 131, 0, 98, 0, - 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 294, 0, 440, 0, 587, 0, 440, 0, 392, 0, 523, 0, 659, 0, 523, 0, 392, 0, 523, 0, 659, 0, 523, 0, 698, 0, 587, 0, 440, 0, 587, 0, 698, 0, 587, 0, 440, 0, 587, 0, 523, 0, 440, 0, 330, 0, 440, 0, 523, 0, 440, 0, 330, 0, 440, 0, 349, 0, 294, 0, 220, 0, 294, 0, 349, 0, 294, 0, 220, 0, 294, 0, 262, 0, 247, 0, 220, 0, 175, 0, 165, 0, 147, 0, 131, 0, 98, 0, - }, - { // drum beats - BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, BASS, -1, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, 0, 0, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, BASS, -1, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, 0, 0, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, BASS, -1, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, 0, 0, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, BASS, -1, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, 0, 0, - BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, BASS, -1, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, 0, 0, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, BASS, -1, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, 0, 0, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, BASS, -1, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, 0, 0, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, BASS, -1, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, 0, 0, - BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, BASS, -1, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, 0, 0, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, BASS, -1, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, 0, 0, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, BASS, -1, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, 0, 0, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, BASS, -1, BASS, -1, 0, 0, 0, 0, 0, 0, SNARE, 0, -1, 0, 0, 0, 0, 0 - }, - { // hi-hat - HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, - HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, - HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1, HAT, -1 - }, - { // bass notes under bass drum - SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, SUB, -1, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, SUB, -1, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, SUB, -1, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, SUB, -1, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, - SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, SUB, -1, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, SUB, -1, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, SUB, -1, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, SUB, -1, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, - SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, SUB, -1, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, SUB, -1, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, SUB, -1, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, SUB, -1, SUB, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0 - }, -}; - -/* setup */ -void init() { - // configure voices - - // melody track - channels[0].waveforms = Waveform::TRIANGLE | Waveform::SQUARE; - channels[0].attack_ms = 16; - channels[0].decay_ms = 168; - channels[0].sustain = 0xafff; - channels[0].release_ms = 168; - channels[0].volume = 10000; - - // rhythm track - channels[1].waveforms = Waveform::SINE | Waveform::SQUARE; - channels[1].attack_ms = 38; - channels[1].decay_ms = 300; - channels[1].sustain = 0; - channels[1].release_ms = 0; - channels[1].volume = 12000; - - // drum track - channels[2].waveforms = Waveform::NOISE; - channels[2].attack_ms = 5; - channels[2].decay_ms = 10; - channels[2].sustain = 16000; - channels[2].release_ms = 100; - channels[2].volume = 18000; - - // hi-hat track - channels[3].waveforms = Waveform::NOISE; - channels[3].attack_ms = 5; - channels[3].decay_ms = 5; - channels[3].sustain = 8000; - channels[3].release_ms = 40; - channels[3].volume = 8000; - - // bass track - channels[4].waveforms = Waveform::SQUARE; - channels[4].attack_ms = 10; - channels[4].decay_ms = 100; - channels[4].sustain = 0; - channels[4].release_ms = 500; - channels[4].volume = 12000; - - // set global volume - // volume = 2048; - - screen.pen = Pen(0, 0, 0, 255); - screen.clear(); -} - -uint16_t beat = 0; - -void render(uint32_t time_ms) { - screen.pen = Pen(20, 30, 40, 100); - screen.clear(); - - // yeah, this is ugly... let's find a way to get a real - // waveform out of the audio functionality - for(int i = 0; i < 160; i++) { - uint8_t no = (i + beat) % 384; - uint8_t n1 = notes[0][no] >> 4; - uint8_t n2 = notes[1][no] >> 4; - uint8_t n3 = notes[2][no] >> 4; - - screen.pen = Pen(255, 0, 0, 100); - screen.line(Point(i, 120), Point(i, 120 - n1)); - screen.pen = Pen(0, 255, 0, 100); - screen.line(Point(i, 120), Point(i, 120 - n2)); - screen.pen = Pen(0, 0, 255, 100); - screen.line(Point(i, 120), Point(i, 120 - n3)); - } - - screen.watermark(); -} - -void update(uint32_t time_ms) { - static uint16_t tick = 0; - static uint16_t prev_beat = 1; - beat = (tick / 8) % 384; // 125ms per beat - tick++; - - if (beat == prev_beat) return; - prev_beat = beat; - - for(uint8_t i = 0; i < 5; i++) { - if(notes[i][beat] > 0) { - channels[i].frequency = notes[i][beat]; - channels[i].trigger_attack(); - } else if (notes[i][beat] == -1) { - channels[i].trigger_release(); - } - } -} - diff --git a/examples/audio-test/audio-test.hpp b/examples/audio-test/audio-test.hpp deleted file mode 100644 index 21d2d7a39..000000000 --- a/examples/audio-test/audio-test.hpp +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#include - -#include "32blit.hpp" - -void init(); -void update(uint32_t time); -void render(uint32_t time); - - diff --git a/examples/audio-test/metadata.yml b/examples/audio-test/metadata.yml deleted file mode 100644 index d047d5c67..000000000 --- a/examples/audio-test/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Audio Test -description: A basic audio test. -author: pimoroni -splash: - file: ../no-image.png -icon: - file: ../no-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo \ No newline at end of file diff --git a/examples/audio-wave/CMakeLists.txt b/examples/audio-wave/CMakeLists.txt deleted file mode 100644 index 5d2ccf06b..000000000 --- a/examples/audio-wave/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (audio-wave) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (audio-wave audio-wave.cpp) -blit_assets_yaml (audio-wave assets.yml) -blit_metadata (audio-wave metadata.yml) diff --git a/examples/audio-wave/assets.yml b/examples/audio-wave/assets.yml deleted file mode 100644 index 5cd1b6fc8..000000000 --- a/examples/audio-wave/assets.yml +++ /dev/null @@ -1,2 +0,0 @@ -assets.hpp: - assets/glass.bin: glass_wav diff --git a/examples/audio-wave/assets/glass.bin b/examples/audio-wave/assets/glass.bin deleted file mode 100644 index aa1273ef2..000000000 --- a/examples/audio-wave/assets/glass.bin +++ /dev/null @@ -1 +0,0 @@ -€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€}}~|qb\bt¯Óéæα™{Q$ 7a‘ÂßЗW56G^­ÒÛɪ„V)8Y…ºÜɈH2@Tcs…šµÚã¸qCAWis†§ÉÚΦtTQ[WD=V¤°¨“w`VRG5.Af‹žœˆv}¥ÓÙ«p[ºÝÒ§y„];?o¢®’qhv…‚jRNa{›°Ã»“j`ušˆobr—°°©±Ä›a3'Fƒ·ÁŸoPB?P{«½­“~d<,E]¡¨Žrr‡——‡‰¨Î׸ˆg]bu•©psjG)0JM4+Q‘Â˯|H.6Mb|¨ÕáÉ­œN4Pc‡ÀêᵌpVES|˜jN=11P„«®™‡†•­ÁÀ§‚dRO^~¡‡jbm{ˆœ°®Š\HUf`H=T‚©·´®­¬¥‘pM:Fd~Š–²ÔàÇ•gVf‰§°¨¥²ÃÀ¤€eWQMO\xžº¸™vjwŒª´¯—{ouƒŽŽƒpcbku„¡ÅÜØÀžuNDg¼·§¡Ÿ“vpn|›°žtax˜Ž‰“•‰ƒŽ‘‹}k`mˆ’wNA[˜žœ•‹zz†Ÿ¶·ž}ifmy‰“ŠlF,*Hz ¦’|mZB;Po~‚­½­„Y?B\vwd\ipY9:^}xwxvzˆ„Y%Gv{^JSoŒ›i;$2W}’”Ž˜nVLHIYtzY26f‘•„€ˆ‰~r`A%4m¢§‹}Œ¡¦ ›”ƒpijeZTSM?c–¹Á¸¥Ž{rjYD@Sju{…‹„z„›£up|†‚xqq|‘ ™|bZcoy…˜•…l[b”‹pds‰z\A5Fo‘ŽjIDThw€}ql¢¯šzlsynV>6Hs¢´Ÿ~u†•‹oWI<14NqŽš—Š}yyqZEEXkt}–‹si{—šwB"5nž¡‚ksŠwR86KhuhPLfŒ¢¡’kZV`puhVWw¢±Y=Ou†yb\nŠœ™ˆwl`OFQk}~wz‡“™˜ƒ{€‡gSXrŽ›˜‡q]TXdorlcbo‚Š‚rlw‰\DOx£wjiq‰qt©¤Žƒˆˆ{t‚’‰iNIRZ]bl}‘  •‰}qfiz„zjlŽŽ‡}hQQt—•ucrŒ—˜œ›‰pgicTRf~ˆ’«ÆÊ´™gLDVp€‰™­±vvfs—­¢‹‹ž ‚dh…˜‘‚‚}~Š »Ê¾›xhhimš­°®°¯Ÿ„po}‘Ÿœ‡ppŽ´À§€p‚ £„fn—»» —­·©Ž{€”œ|€›°¯œŠ„‡‹{mwš¸¸£˜ž‘…œš…ol›¯©Ž{‰­¿©}^^x™­ª•ˆ‘¤©–~ojlvˆ“††“•‘ƒx|Œ–‘‡„ŠŽŽŠ†„ˆ“˜~snfYWn’¬­›…wx„ˆ{cZm‘§ ‚`R_}”“ox‘¤‚g_k}‡‡ƒ~€„…~m]Zgw€ype\[fsui]aw‹‹yil|‹Œ‡{plqwupr{ƒ‚|wtsuz}vhahw€}rkkt~‚}tlhkvƒ„tbexr^`t‚{vma^kxz{‰š•zdfpkYP[rˆ—›”‰ƒudX\iqqmknw„ŽŠ€sfbs’¥œe`m…{iam€ˆ€uu{}vkbaju{wrs{„ŒŽ‰{nkr{ˆ‹ye]bilsŒ‘ˆ{wust|Œ—“…}†•š~tsy|vkel{ˆŠ†~tmo{„rhn’“‚ojw‹”Žtvtcby•ž’…‚†‡„‚‚ƒ…ˆ„wr„£³¥‰vog\[ft{‡Ž‚slq‚“˜‹yqx„…{rv†™Ÿ“{jl{Š‹…}xsru|xpp~”ˆuko|ƒ€vu‚—¢œŽ…†Š‹‡†ˆ‰„}‹–”„riiou}‡Ž‰xqmnu|ƒ…†„|pim|™ž¡¢ •…yx‚Ž”’‹ƒytzŠ˜˜ƒxmchw…Ž”™˜‡„yprƒ– œ‘ˆƒ‚…ˆ‹‰ut’…ukebbjwƒ’Ž„ˆ–•‚nl|‹‘’—œžž—ˆxqsurmp˜¦¥ž™—~la`enzˆ•›’‡„‡‰„„’™”‰…†„zt{œž“†‚ˆƒ€ˆ’x€Œƒ{{~~~‚Š’——‘‰‰˜—Œ‚}|~„‹†„‘–Œynpzƒ†ƒ€Œ£—jcis|ƒ˜Ÿ–‘‰~uu|‚ˆ•’…xsvz|{wsy‰˜–ˆ„‹‰€}ƒ‹‘”‘…vptyxw{†Œ‰xnw‚w[Sp–¡“‹”˜ƒaPZt†‰‚}‘…rfirvx~‰‘€oir€„{su{ztu€‰…xmlrx|~€|mXRh†Žzjz–c?Ly•ƒˆ~[EOlƒ‰†ƒ‚vh]_kvvpow€xsu{zofl‚˜˜‚kgs}zpkoutlhs‡•|nllcZ`q{ws~’Šukcgt{sily}wtj[Vh„‘‹„„€pae{‹y‰Œ†zplr}ˆŠ‚wpqvwspt|~vll{Ž–‰q^]k”œpXa‡§¡fj~‹‹ˆ‡qjs‚†{rv‚‰„zv{‚‚|x{†’‹†ymp‚“’‚rs€ˆƒzy…x‘Ÿžƒ|wokmsvx{€ƒ„‰’‰}z‚Š‹ˆ‡Š‰ƒ}Š‹ƒƒ‰‹‡‚†ˆ€ˆŒˆ~vszˆ•”‡yv}„…„ƒ€{y€Œ‘‰zt}Ž™’‚y~Š‰€~‚‡…ƒ‹‘Ž„~}{ur}’¡›ˆxw€‹„wwŠ¤ªfMY‚¬»§{UPp›°¢_T`~ ±¢k{œ¦ql~Ž”˜›jLT©²˜t[Ymˆ˜”†~~…’qf`bq‡‡€¢¥ysvvuz‚vqyz€š˜”–’}^Qd‰£¤–‡|‰“”‰zrx‡—¡¤¡™Šub]fyŒ–xft Ä¹‡`hŽ¡‰\BPzž£Šnk~‹…Ž¢ª™{jw—®§‡jgx‚u^TazŒŽqjp}„ƒ€|thev•ª£Šus}‡ˆxoigijilw€uotzvos„‘Žuuy|}ztpqvulflz…†€||‚‚yrnnw…Œ~qlpuvvy~ƒ‡’“Šzmku…‹yeaq„‰€|‡“’ƒww…‡‡…ˆ“ž›‡sp}‡‚xu~ˆŒŠƒ~}‚€„‹‘’ˆˆ‹ˆ†œ°¬“…’¤ ‰wwykWPa~“”ƒngt‚~lf~Ÿ«•wq†ˆut‚Ž“ © …dT^uƒ¤©š‡…ƒpXPd‡œ‘ugvŽ’{`Xg~Ž…|z|{tqx~ofq‰™‘yiktp]OZy‹xr„hSZw‹wio€‘‡zpkllnuƒyllz„|h^j‚’Ž€w{‚{gYb|ŽŒƒ„‘™tXMZu†lh{”š|sph]Zg–šŒ~‹ŒsQG`…—Ž‡ž±¬‘q]Z_dfq‰¢¨•‚ƒ“—‚g\gv{{“­½¶•p_j|„‚‚†„{w€Œ}h]eš¨¥›œ”€miu‡™¤£™Ž‰„ynnx€~€‘©² ‚oo}Š‰{p{›¹½¨‚~xru…˜¡œ“”—Žwa]mƒŒ†€†–¡›‰wsy€z|‹¦Ÿ„‚|ss~‹…‚Œœ¡’{lmz…‡‚~‚ŠŒ…|wwxw{„ˆ|v{‰’Œ{ns†•“…yyƒ}||zwv|…‰‚tjn{…sim|Š‹~ohnwwmfkx~xs}Ž{edw‰‹~rr}‰Ž‡vf]_it{zrllrz{ujdjzˆ‹uory|yqmr‹ˆzmmxƒ…~tlhinx~wppv~~qa^l€„s__s†‰wusps~‹‰€yslgecah|‘–ˆz€”¡—}ichmqvz{wrrxƒ‹Š‚}€ˆŠƒvjden|††‚Ž™˜Ž„{vrrsqpwˆšŸ’|or€‹‹…ƒ‡‹‰†‡‰†|rr€“Š~|…•„xsv~ƒ‡Œ’“‹€~„†}rq{„…„‡“––‘ˆ{{||~†–˜–’‹‚{{‰ŽŽ‹ƒzw}…ˆ†…Œ”™—‘ŽŽˆƒˆŠ‰††ˆ‘Šƒ…Œ…€€ˆ‰‚€„ˆ‹‹‰†„…‰Š…|†Œ‰†…ˆŽ’…ƒ’Š}x{}yx{†Ž‹ˆ†‚‚„„ƒ…ˆŠˆ†††„~|{|ˆ‰~tsy~}z{„‹Œ‡…†‡„ƒ‚|urtzƒˆƒvmoy}{†ˆ„€€ƒ‚yvx}‚ƒ~xvz~{vtuwuqpw~zy€‡…zqrxysmp{|qjnx€ƒ‚zvutrnotxwux€„‚|wvx{}~~€‚umlqsrquxwssy€ƒ|upqw}~|yxz~~vnmptwz}|xuw{~{uporwyyxy}€€}wqmlnrw~…‡ƒ}z{|||}}}}‚„‚}zxwyz{{}…†‡†„zvv|€xonu…„€|{|€„…‚{xy~‚€~{{ƒ„}|~€€ƒˆ‹‰yvx{|z{€…ˆˆ†…†…ƒ}€|z}ƒ‡ˆ†‚€€‚‚‚„ˆ‹Š‡ƒ}}}}||„Š‰…‚‚ƒ„„ƒ„…†††‡ˆˆˆ‹Œ‡zz~ƒ‡‡ƒ|z~†‹Šˆ††††‡ˆˆ‡‡†…ƒ‚€}|…‰ˆ†‡‹ŽŒŒŠ‡†‡‰‡‚€€}{†‰…€€ƒ…ƒ~{{€†‰‰‡†††„‚€€„‹’•ˆƒ‚ƒ„„…‡‰Š‡„€~~~~|{~…ŒŒ…~|„…yvvtrsx‚ƒˆ‘˜˜“ŽŽ‹‰…~umjnv|}{yz€„ƒ|wx€‡‡‚|yz~ƒ}yy{~„…‚}{~‚ƒ€|{|~~}}€ƒ„~{z{z{}‚|rmr}‚|phn}ŠŒ‡|xtv~„‚|xz}ƒ‚ylbbhp|›ž”„wpnnnmlmnqsxˆ‡snpy…ƒ€€‚ƒƒ€~~~}zskimqsv€ˆƒtku…Šƒ}~~wmlu€‡‰‡€xsrohcix‰—˜ˆulputonqux}…‹Š‚ysqtvurt|…‹’‘‹ƒ}ytmkouy}ƒ…tpv|y}…‡€us|‰ŽŠ‚}zwx}}vv€ŠŠ…€ztsw|~‚‚ƒ‡ˆ„{vvvttw~‚…‡ˆˆ†ƒ€~|{}€„ˆ‹ˆzvvxz}~~~ƒ‡‡‚~~€|yy|†ŠŒŠ†…ƒ~~‚‡Š‹‹Šˆ„‚‚‚‚~ztpquz|„ˆ‰ˆˆ‰Š‰…€|yxz…ŠŒ‰„~zy{~€€ƒ…ƒ~zz„†…„†‰‰‡ƒƒ†‰†~vty€…ˆˆˆˆˆŠŠˆ‡ˆ‰‡zxz}~~}~€€‚‚ƒ†‹Ž‹†wsuz€€„††ƒ€~€‚ƒ‚€~~€ƒ‡‡„~|„†…‚‚…‡†ƒ||~„„‚€‚ƒ„|xwz~~ytu|…‹‹ˆ„‚„†…‚~{{|€€€€ƒˆ‹‰„ƒ†Š‰‚{xxxwwxz|~€ƒ……ƒ€‚ƒ„„‚}~‚„„‚}zwuuuvy{|}~€‚€€€€}{}…ŒŠ„‚…‡„~zy{|{z{„‡†„…‡†{x{€„…ƒ€ƒƒ{yzzxvz€…‚}{~{sory€ƒ‚€~{yz}~|z|€„†…‚~zxwuv|…‹‰‚}}~|wvz†…€{z|~€ƒ…ƒ}zy{}|zz{}~|yx{~~{z|€€}zxz}€‚ƒ‚~xw|…‰†ƒ‚ƒƒ‚‚ƒƒ‚€|xwxzzxw{~}wsv}‚€{wvy|~€€~~}{{€…‡ƒ~|}€zwy„„~}|{zz{~ƒ‚€ƒƒ€€‚€yss{…ˆ„~{~ƒ†‡…‚€‚‚|~‚„€xtvz|}~„†„~~‚……‚‚…‰‰‚||ƒ‰ˆƒ~{zyxwwx{~€…‰‰†„…ˆ‡~€‡Œ‰ƒ~{||{{}€~||‚‚~{yz{|}„‰‹‰…‚€~}ƒ†…}~|vvy|{y{„‡ˆ‡„€~zy}‚ƒ„ƒ|}€~yw{…„€‚††ƒ~zyy{||}‚ƒ‚€€‚ƒƒƒƒ……ƒ~ƒ„{xy}ƒ‚€€ƒ‚€€~{y|~~‚…†…ƒ€‚…„€€€}zz}‚‚}wyˆ‰‡†…‚}}†‰‡†…„yvy€†‡…‚€}{z}ƒˆ‹ŽŒˆƒ~wqqu{}{yy{|{{}…†„~~~~„†ˆ‡…ƒƒ„‡Š‹Š†‚€‚ƒ‚€€‚ƒƒ‚€}zxy|€~||}€€~}~~}}‚ƒ„‚€‚†ŠŠ†zxxxxwy~„ˆ‡‚~ytsu|‚†‡‡†…„‚‚€~}}}~€‚ƒ|xy~ywz€~|}€€€‚ƒƒ€|z{{yvux~‚‚€€ƒ††…‚€€€~~„…ƒ€}zyyyz|ƒ}z{~}}}~‚ƒ‚€}|}€‚}}~~}}~~}}~~~}}~€€~|zz|€~{|„†„€}|}}}~„††„}|{{}€€}{{}€~~€€}{z{}~€€~ƒ„…„„„„ƒ~}}~~}~€€~}€~~~|{}~|xvx{}~€‚ƒ‚‚ƒƒ‚€€‚ƒƒƒ~||€‚~|ƒ‚~z|„„‚~}}~€‚‚€|z{|{yz~ƒ††…~‚†…€|zz{{|}~€‚„„„‚€~€€~}~‚‚‚‚~~~~~~~}{zyz|~€€‚ƒ‚~„„‚€~~~€€}z{€„„{~„†{z‡‰‡ƒ€}{z|€€|{{|}~}ƒƒ€||‚‚}}€‚‚€€ƒ„‚~€„…}|~‚|z|€„…ƒ€}}€}|~ƒ…ƒzy{~€€‚…‡„}}~}{|~~~€ƒ„ƒƒƒ„ƒ€~}~ƒ~€‚~}{z|€ƒ‚‚ƒ„„ƒ€}|~€€~}}}€‚„ƒ‚‚‚ƒƒ‚‚€€‚€~|}~~}}~€‚ƒƒ‚€}}||~ƒƒ‚€‚ƒ„„ƒ‚‚‚‚‚€~|{{{zyz}€‚„……ƒ€€€|{|‚‚‚€~}||~‚€€€€~}|{|~ƒ„ƒ‚€~}~}|zz{~€‚‚€€}}~~~}}~€€€€€€€~}‚ƒ€}zz|‚ƒƒƒƒƒƒ‚€}{yz}€‚ƒ‚€€€€‚……ƒ€€~}|||}€€~€‚€~|}€„†…~‚ƒƒ‚€€€€~}}~}~ƒƒ~{{}€€~}}ƒƒ~€ƒ„ƒ}}€~~€€~}}}‚}}~€‚}}‚‚ƒƒ||}€€~~~~~}|{|~€€~~€‚€€}|zz|‚‚‚€~}~€€€€|zz~€€~€‚‚€€~}}~€|xx{€€‚‚„†„{tx„Š„|z~~€„…~xzƒ‰‡‚~{y|€ƒ~~|}†ƒ{vx|z{„‰†~wx~„„‚}}‚„‚}yy|„ƒ~z|†…€{y{„†ƒ~|||z|€…†ƒ~|~‚…ƒ~wtx…†‚}ƒ|xy~„‡…€{x{…„{|‚‡‰†|z|€~zwy†ˆ†€||‚~{y{‚‰Š…~z{€ƒƒ~zz†‰†€zwx}‚€||€…‡…€|z|……}|~‚†…€{y|€„„‚~}……€zutx€‡ˆyzƒ‹‹ƒ|xxz‡‡€yx}‚„€zuu|†‹ˆ||€…‡„|vv}†Š‡xvz€„ƒ|wyŒŒ‚z{†…xuz‚Š‹‡zy|€}vrw‰Šƒ{wz‚‚}xw|„Š‰ƒ|yz~ƒƒyw|…‹Šxuy€…„~y{‚‰Œˆ€xvz€„ƒ{|‚ˆŠ…{sqv…„~z|ƒ‰‰ƒ{wx}‚…ƒ~{}‚††€xrsz„€{y}„ˆ„|ts{„‰‡|z}‚†…xuy‚Š‰‚~ƒ…‚}xw}†ŒŠ„}{~zvuz‚ˆˆ‚{wx|€zuv|ƒ‡„~zxy}~}{{~ƒˆ‹Š…~z|‚†…~~‚‡‰†zy}‚„ƒ€}}‚ƒ‚|uru}„…~~ƒ‡†|xy|ƒ‚~{|‚‚€}{|€†‰‡}}„ƒ€|z|„ƒ€}}€‚‚}{}€ƒ„„~~€ƒƒ~zz~‚…„‚€~zwwz}€ƒ……~}ƒƒ€ƒ‡‡„}}€}zz}‚ƒƒ{y{~~ƒ……‚}{|~}}~€‚ƒ‚€~|{{}€€€‚„…‚|{~‚…„€~zvw}„…‚{x{…‘™™‘€iWYn„‹…ƒƒ…†~vv{€‚†‡„{wvz‚…{{…‚{wwz~„ˆ‰…~yy}‚‚…‰‰vpt}†Š†~xx{||~…‹Š„}yvw{€ƒ|wuw}…Š‰„{{|~‚‚„†…|yz~‚ƒzxy|~~~~~€ƒ…„€|{ƒ‡ˆ…€~{{‚|yxz€‡‹‹†zj`exžž”†yqpu|…Š~rlnu~…Šˆ‚|z{€…ŠŠ†||€€„‡‡‚ypow…‘–‘‡zpmsˆˆƒ‚‚}vtz…ŒŠ‚xrrw€ˆŒŒ‰…}{|}|yx{~~~€‚‚‚~{y|‚}‚…††„€|{~‚„ƒ€|yz~‚‚~€€€‚„‚~|~ƒ„„„~}|||ƒ…‚}zy{}€ƒƒ‚€€}}€€~~~ƒ‚~……ƒ}}‚~|zz{|~€‚ƒ‚~z{~‚‚‚€}{{}ƒ~}}}|}€€€‚‚}}}||}|{|~}zy|„…‚€~{xuw~…ˆ…‚€~‚€€€}|}~€€€‚~€€‚‚~}~€€~|{{}~€ƒ……‚~{{ƒ†…€|{~€|{|~~}}}ƒ„……‚}xw{‡‰‡ƒ€€~}~ƒ‚~}{{ƒƒ€~€ƒ‚}{|~~}~€€€‚‚~zyz~‚‚€€€}ywz€…„€|}„…‚~||€}{}€€€€~ƒ…„‚€€€}yy}‚|yy{~‚~‚ƒ„„‚|||}~†‰ˆƒ~{z|~€€~}~€€€€€€‚‚‚ƒƒ}||||{{}€ƒ„ƒ}{z~ˆŒ~plt€ˆˆ„}ywx~„ˆ‡‚}yx|ƒŠŽ‹„}yxz~‚€}{}}|zz}„„ƒ€~~€‚ƒ€}{yz}ƒ‚}}}}}~€‚„„ƒ€€}zxy{~€€€‚„ƒ€~~€ƒ…„€}}€ƒƒ€}}||}ƒƒ|y{„†„‚}{{~~}}~~‚€|z{†ˆ„~{{ƒ………„ƒzvvz€ƒƒ€}||‚ƒ„ƒ‚€~}}~‚ƒ‚€~|yy{‚‡‡yv{ƒ~~‚~xvx~ƒ„‚~€ƒƒ~}~€ƒ„‚}yx|„…„‚||€ƒ‚|}€}{|~„„‚€€€~€~~€„„€{xwy}‚ƒ€||‚€€ƒ„…ƒ||€€€~||}~€ƒ…„‚€€~~€€€‚‚}zyz‚ƒ~}€€~€‚‚~~€€~||}~~~€‚‚|{}€‚ƒ‚~~€€~{{}„…ƒ~zy{~‚‚ƒƒ‚€~}}}}}~€}{{|~~€‚‚€}||}}||~€‚‚€‚ƒ~|~„…ƒ~~~€‚€~~€€€€€€€€~}}€}|}~€€€~~€€~|}~€€~€€€€‚ƒƒ€€€€‚ƒ…‡‡„€|z|€~}}}}|||}ƒ„††…‚~~€€~|||~€‚ƒƒ‚€~~~€‚‚€~|{|}€€€~~€€€€€€€„…ƒ~zy{~ƒ††„€|{{}~~}}€€~€€~}}~€‚€€~}‚„„ƒ~|{{|~~~~€‚‚€€€€~€‚‚‚~{yz}€‚‚‚€}|}~€€‚„…„~€€€€‚‚€}zwuvx{}}~€€~}~€€€ƒƒƒ€€‚‚‚‚ƒ‚€€~|}~~~~~€‚€~}||}€~}|}}}}}~~}|~€€‚‚€€‚‚€€€€‚‚ƒ‚‚€~}}€ƒ…†„|z|}~~€€~~~}|}€‚ƒ……ƒ~yvwz}~~~~€ƒ„†‡ˆˆ†‚~€}zyyz}€~~€€~~~}{z{}€‚~}~ƒ…†…‚€€€€€€~~~}{|€~{{}~}|~€ƒ„„ƒ‚ƒ…‡‡…„‚}||}~~~~}{yy{~€€~}}}}}}}~€ƒ…‡…ƒ€€ƒƒ‚~~€€€€‚‚€€€~||{{{}€ƒ„ƒ€€‚ƒ‚~}}|||{zyyz|}~‚„……‚€~€~€‚€€€€€~|{{~€€}|~„„‚‚‚‚}{{|}}}||}~ƒƒ€€‚‚ƒ„„ƒ‚}||}}}}~€‚‚‚}~~{z|‚‚~~€€€€€€€€~}||~€€€ƒ…†„‚€€€~}}~~}~€€~}}~~}|}~~€‚ƒƒ‚€‚‚‚€~}|{|~€~~€€€€~}}~€€€€‚ƒ‚€~}~€ƒ„ƒ€|{}€€~~€€€~ƒ„ƒ€~}}~~~}}~€€€}{{|‚ƒ‚€~~~€€€‚ƒƒ‚€€€~~€~|}~€€~}€‚ƒ‚€~~€€€~€€~~~€€€~}}}~~‚‚€€~}}€‚ƒ„ƒ‚€€€~~€€~}}~~~}}}~€‚‚€€€€~~€‚‚~}}}}|{|~€‚‚‚‚ƒƒ‚€€€€~}~~€€€€€€€~}{z{}~~}|}~€€€€€€€~‚ƒ€€€€‚€‚‚}|}~€€€~~€€€€€€€€~~~€€€€~~‚}}}}~~€‚ƒ‚€€€€€€€€‚€€€€€€€~~~‚‚~€€~||~€‚‚€€€~}~€~|{|}€€~~~€€~~~€€‚€€€~~€€€€€€€~~~‚~|}€‚‚€€}||}}~‚„„~|z{~€~~‚„„|y{€„ƒ€~~~}}~~}}€~|}„‚}yz}€‚‚€~€€€€€~}~~~~~€~}}‚€}~€‚€‚‚}||~~~€‚€~~~~~€€€€€€‚‚€~€‚ƒ‚~€€€€€€€€€€~€€€~~~~~~~€€~€‚ƒ€€€~€~€€~~~€€€€‚‚€€€€€~~€€€€€€€~~~~~~~~~‚‚€€€~~~~}|}~€€€~‚‚€~}}~‚‚‚€~}||||}~€€€€€€~~~~}}€‚‚€€~~~€€~~~€€€€€€~~~€€€€€~}}~~~~~~~~~€€€€€€€~{yz}€€€€€‚‚‚ƒƒƒ‚€~}}|{{|}~~‚ƒ‚‚€~~~~}|||}~€€€€€‚‚~€‚‚‚€€‚‚€€€€€€€~~€€~~€€€€€€€€€€~}{z{~ƒ‚€‚„ƒ‚|zz{{|{{z|~ƒ…†‡†„‚€~||€~|}ƒƒ|xvwz~ƒ„ƒ‚ƒƒ‚€~~€€~‚‚€|xwy}„‚€€|{{ƒ†‡…‚€€€€}{{}~€‚~}~€‚ƒ‚‚€}|{|~~~€~~~~€‚€€€€€€~~~~~~€€€€~}~‚„ƒ~wtw{‚ƒƒ„‡†‚€ƒ„ƒ€|wtuy||zz|„†‡‰‹‹†z{}}‚ƒƒ{vstvz„‡†ƒ€ƒ„‚~{~ƒ…‚|xy……‚|wv{„‰†€ƒ…ƒ}xvyˆ‰…€}}~€€}{|~|}‚„|{‚€ƒƒ‚€~|||}~€€€€~‚}~€€€‚‚~|}€€€€~~‚‚€€~}~€‚ƒ€|yz|}‚‚‚‚ƒƒ‚€€€€}}}~~‚~~~|||~€‚‚‚}~€€~}|}~~}~€‚ƒƒ‚€}|{|}~€€~~~~~€~~€~~~}}}€€~}|||}}~€€‚‚‚€~||~‚‚€~}}~€€~||{{|~€‚ƒƒ€€€€€€~|}~€€~~~~}}€‚€~~€€€‚‚‚~~~€€€€€€€~}~~€€~~~~~~~~€€‚‚€€€~~~~€~}~€€~~€€€€€€€€€~~~}}}}}~€‚‚‚}}~€€~~~~~~~~~~€€€€€€€€~|{|}~~ƒƒ‚€€€~~€‚‚€~~|{|~~~‚‚}|„‘‘~heu‡Œˆƒ|z~ƒ…ƒ€}{{|}zz€‡‰‚{xz}†‰…}uuy~‚ƒƒ‚|{|‡Š‡€ywz}€€~~€‚‚||}€~|}ƒ‚€}{{~‚„„‚€€€€~~}}}}~‚††‚~€€‚ƒ‚~„„~xw|‚…‚|yy|~ƒ‰Š„}}€€zy€ˆ‰zxyz{„ˆ‡‚ztv€ŠŒ†‚‚|xz‚‚zw|…‡€|€‚wjs‘§œzcdv†‹€uquz€ˆŠ€tpx„Œ†}|{{}}€„„xvz‡†xz€„‚{yˆ‰wx€„‚~}}{{}‚€}|}„…‚€~|{„…‚~~}}}~€€}|‚……ƒ|z{~€€€€‚ƒ‚€|xx{€„…ƒ€€‚€€‚zvwyyz}……ƒ~€€€€€~~€€}|~ƒ„„‚|urv†‡‚{xy}ƒ‡‡‚zvw~…‡ƒ}yz~‚ƒ‚€~|z{~‚†‡„||‚€€~|{{}€€~}}~~}~€‚„…„‚|zz|€~}~‚„ƒ‚€~~~}}~‚€||ƒ„‚‚~~~~~€‚ƒƒ‚‚‚‚ƒƒ‚~||}~~~~~~~~€€~~€ƒ‚|z|~ƒƒ€~}€€~~~|}‚†…€||~€€€~~}|{|~€€~}}‚€~|{}€‚ƒƒƒ‚}|}~~€€~€‚‚~zz~‚‚€}}‚€~}~€€~~€€~~}~€€~}~€€~~€‚~€‚€‚ƒ‚€~€€~~€€}~ƒ‚€}}~€€}|}~€€€€€€€€€}}‚ƒ‚~€‚‚€}|~‚„‚~|}€‚|{~ƒ}}~€‚‚€~~€~~€}~„ƒ€~€~{|††‚}|}€}|~€€€€€~~‚€€€€~}}€ƒ„~}€~|}€~}€€}|~‚€€‚ƒ‚€~}}~~~~~~€~~€€€}~‚€}}€€€~€~~€€~~€€}{{~~|{|}~€€€‚~€€€€€€€€~~}~€€}|~€€€€€}|}~~}|}~€€€‚}}~€€}~€€€‚€€‚€€‚€€€}{{}~~€€€‚€~}}}~€‚ƒ‚}}€€€}}~€‚‚€€‚ƒ„ƒ€~~~~~}}}}~€€~|{{{{|~}|}~~}}~€€€€€€€€€€€€€€€€€€€‚‚€€‚‚€~}zz}€€~~€€€€‚ƒƒ‚}}‚‚~ƒ‚€€€€€€~}}}}}}}}|||~€€~€€€€€€~}|~€‚ƒ€€€€€€€~‚ƒ~~~}}~~€~~€€€~}}}}~~~~~~~€}}~€€€€€€€€€€€€€€‚‚‚€€€‚ƒƒ‚}|}~€€~~~~~€~~~~~~}}~~}|||}}~~~€‚€€€~~~€}{|}~~~€€~}~€‚€~}}}~~~‚~~~~~~~ƒ„„ƒƒ‚‚€€€~}}}~€‚‚‚‚‚ƒ„„‚€€€~}}}||}~~~~€‚ƒ„„ƒƒ‚€€~|{|}€~}}‚€„†…~~~~~€€~|||~~‚~~€€€€€€€~~~~~€~~€€€€€€€~~€~~~}~€€~~€€€€€€~~~€€€€€€}|~€‚~~~€€~~~~~‚€~~€~~~~€‚‚‚~~~€€€€€€€€€€€€€€€€€€€€€€€€‚‚€€‚‚€€‚‚€€€€€€€€€€€‚ƒ‚€€€€€€€€~~~€€~}~€€~~~~}|}~€‚€€€€€~~~~}}}~~~}}~~~~~~~€€€~~~~€€€€€€€~~~€€€~~~~~~€~~~€€€~€€€€~~‚„ƒ€}}}}€€€€‚ƒƒ‚ƒ…†ƒ€~~~~~~~}{z{~~}}‚ƒ‚‚‚€€~}|}~€€~}~€€€€€€€€‚‚~€€€~}||}€€~~~}}}|{{|}}~€‚‚‚€€€€€€€~~~}}}}~€€€€€‚‚€~}}~~~}~‚‚ƒ‚‚€~}}~~~}~~~~€€~~~~€€€€~~~~€€~~~€€€€€~}~~~~€€€€€€€€€€€€~}||}~~~~~€€‚‚‚ƒƒƒ‚‚€~}}}~}}|}~€€€€~~€€€€€€€€€€€€~~€€€€€€€€€€€€€€€€€~~~€€€~€€~~~~€€€~~~~~~€€€€€€€€€€€€€€€€€~~~~~~€€€€€~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~€€€~€€€~~~€€€€€€€€€€€€€€€€€€€€€€€€€~~€€€€€€€€€€€€€€€€€€€~~~~~~€€€~~~~€€€~~~€€€€€€€€€€€€€€€€€€€€€€~~€€€€~~~~~€€€€€€€~~~~~~~€€€€€€€€€€€€€€€€€€€~}}€€~‚~~€€€€€€~ƒ‚}}€}}~€€€€€€€€~}~€€~}~€‚€~}~€€~~~€€~~}~€‚‚}}€€~~€€€€€€€~||‚‚€}{}}{|……€{z|€ƒ…„‚~€€~}‚‚€}{{~€{yz~ƒ…†…ƒzy{€„…ƒ€~}}}}~„…ƒ€~}}}~~}~€}|~ƒ}{{|}}~€ƒ…„‚~€€€~{z|€€€}}‚‚}{|€€€|xx€ŠŒ€uprx€†‹‹ˆ‚}zz}‚‡‡„|yxz€‚ƒ}yz}‚„„‚€}}~€€}{y|…††…€{y|‚„‚}}~~}‚„„‚€}|}€‚€€€€€~~€€~€€~|zz|‚€€‚ƒƒ€‚}|~€€€€~}ƒ†ƒ~xw{€ƒƒƒƒ‚€}|}~€€€€€~{zz|~~ƒƒ€€‚€€€~}}}}}}‚‚‚‚€~}}~€€~{y|€ƒ„ƒ€}||~€~~€‚‚€~}€}{{|ƒƒ}{{~‚ƒ‚~~€}|}€ƒ„~}}€‚„ƒ‚€~}||||{}€‚~‚~}~}|{|~‚‚€~~€€€€~‚‚€€€€~~€‚ƒ‚~~‚‚€€€}||~€€€€‚‚€~|||~€‚€~~€€€€€~||}€€~~~€€€€~~‚€}}~€€€€~}~‚€}|{}~€€‚~}~~~~€€€€€€~}~€€€€€€€~~€€~~€€~~~~~€€€€~}~~~~‚‚€~~€€€€€~~€€~~~€€‚€~~~~~€‚~~€€~€€€~~€‚ƒ‚€~}~€‚€€~}}~€€€€€€€€€€€€€€‚‚}|}~€€€€€€€€~}}}}}~‚‚ƒ‚€~||~€€~~~~~€}}}‚~~€€€€}}~~€€€}}~€‚}|}€€~~~~€‚€~}||}€€€€~~~~€€€~~€‚~}~~€€€~~~~€€~~~~€€~€€€€€€€€€€€~}~€€~}~€€€~}}~€‚ƒ‚€~}}~~€€€€~~€€~€€€~~~~€‚€~~€€€€€€€€€€~~}}€€~€€€€~~~€€€€€~~~~€€~~~€€€~~€€€~~€€€€€~~~~€€€~}~€~~~€€€€€€€~€€€€€€€€€€€€~~€€€€€€€€€~~€€€€€€~~€€€€€€€~}|}~€€‚‚€~~~€‚ƒƒ€~~~€€~~€‚ƒ‚|{{}€‚ƒƒ‚‚€~}|||~€‚ƒ„„„„‚~|{|}}}~~€‚|zz{|}}}ƒƒƒ‚‚‚€‚ƒ‚‚€~}}~~~~€~~~}}~€€~‚‚€~}}€‚ƒ‚€€€€€€€‚‚}||}}}~€€~~}}~~~~‚ƒƒ‚€~}}}~€‚‚‚}|{{{}~€€€~}~~€‚‚‚€~~~~~~~~~~~~~~~}~€€€€€€~~€€€~~~€€€€€€€~}|}}~~€‚‚‚€€~~}}~€€€~€€€€€€€€€€~~~€€€~}}}}~~~€~~€€€‚ƒ‚‚€~~€‚ƒƒƒƒ}|{||~€€€~~~~~~~€€€€€€€€€€€‚‚‚‚‚€€~~~~}~€€~}|}‚€€~}|||~€€‚‚‚€}||}}}~€€‚‚~~~~~~~~€€€~~~~}}||}}€‚‚€€~}||}}~‚‚‚€€€€~~}}~~}}~€‚„„„‚~}}}}}}|}~€‚‚ƒ„„„ƒ‚€~}|}}~~~~~€€€‚‚€~~~€€‚‚€€€€€€€€€~}|}}€‚‚‚‚„………ƒ~{xwwx{~€‚ƒ„„„ƒ‚€~~~~~}||~€ƒƒƒ„„„ƒ~}}}€€~}|{||}}~‚ƒ„ƒ‚€~~~€‚‚‚~}{zzzz{|}‚|zyz{}ƒ…‡‡‡†…„ƒ~||{zz{}€€€€€~}|}€‚‚‚€}||}}~‚‚ƒƒ‚~~}}}}}}}€€€‚ƒƒ‚‚€}|||||}~~~~€€€€€€€~~~~~~~~~€€€~}}||}~€‚ƒ„ƒ‚€~}}}}~~€€€€~}~~€‚‚‚€}||||}€‚ƒƒ‚€~~~~€‚‚‚}}~€€€€€€€~~€€~~€‚‚€€€€~|{}~}~ƒ„„‚~~€€€€ƒ„ƒ€~}}~}|||}}€€~}‚ƒ‚€~‚‚€€€~}~€€}||}~€€€€€€€}|}~~~~€~|{|~€‚‚€~}}~~~~€€€€€€€~€€~€€~~~}}}~~~€€€~€€€€‚ƒƒ‚€€€~}||ƒ††„€{wuvy|‚ƒ‚€€ƒ„……„‚}}~€€€}||}€€‚ƒƒ‚€~}|}~~}{{}~}{zz}€ƒ…‡‡…ƒ€€€€‚ƒƒ‚€}{{|~€€}|zyyy{~„†‡ˆ‰Šˆ…‚€€zsqsz‚ˆŠ‡‚}zwwx{~„†‡…}{|~„††…„‚€~{ywvvxz|}}}}}}||}~€‚~}€ƒ†ˆ‡†„‚‚ƒ„„~}~€€€€~{yyz{{zyz{zywvvwz~ƒƒƒ„…‡ˆ‡†…†ˆˆ‡…„„…ƒ~}|{{{||{zyyz{|}|}~„†‡†…ƒ€‚ƒƒ‚€~~}}}||{|||}~ƒ…††…„ƒ‚€}||}~~€€€}{zz{~ƒ„ƒ€}{z{|~€‚„………„‚€~}|||~€€€€€~~~~}{zyz|~€‚‚€}|}‚ƒƒƒ|{{}€}|||~„†…ƒ€€€}||~€‚ƒ‚€~~~~}}}~~~~€€~~~ƒ„„‚€~€€~~~~~~~}}}~~€€€€‚‚ƒƒƒ‚€~~}~~~~~~~~~~~~€€‚‚‚‚ƒ„„…„‚€~}}}}}}}|{{{|~€€€~}}~€€€€€€‚€~~€‚‚‚~~}~€€€€€}||||}~~}}}~~~~€€€€€€€€€€€€€~~~~~~~~~~€€€€€€€€€€€€€~~}}~~~~€‚ƒ……„‚€€~}|}€€€~~}|}~€‚‚€€€€€~~~‚}||}€€€€€€‚‚~}~€€€€€~~€‚‚‚‚€~}~~~~~~€€€€~}}~€€‚‚€€€€€€€~}|}}~~~~~~€‚~}}~€‚€~~~€€€€€€€~~~~~}}~~€€€~~~€€€~~~~~~~€€‚‚~}}|}~~~}}~~€€€~~~~}}}~€€€~~~€€~~~~}~~€€€€€€€€€~€€€€~~~~€‚‚‚‚€~~~~~€€€€€~~€€€€€€€€€€~~~~~€€~~€€€~~}~~~}}~~€€€€€€€€€€~~}}}~€€€€€€€€~~€€€€~~~~~~~€€€€€€€€~~~~~~€€€€~~~~~€‚‚ƒƒ‚€~~~}}}||}~~~€€€€€€€€€€~~}}}}}~~€€€~~~~}}}~~~~€€€€€€€€€€€€~~€€€€€~}}~€‚‚‚‚‚€€€€€~€€€€€€€€€€€€€€€€€€€‚‚ƒ‚€~~~€€€€€€€€~~~~€€€€€€€€€~}}~~~~~€€€€€~~~~}}}}~€€€€~~~}}}~~€€€€€€~~~~~~~€€€€€€€€€€~~~~~~~€€€€~~~~€‚‚‚€€~~~€€€€€€€€€€€€€~~~€€€€€€€€€€€€€€€€€€€€~~~~~~€€€€€€€~~~€€€€€€€€€€€€€€~~~~~€€€~~}}}~€€€~~~~€€€€€€€€€~~~€€€€€~~€€€€€~~~€€€€€€€€€€€~€€€€€€~~€€€€€€~~~~~€€€€€€€€€€~~~~~~€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€~~€€€€~~~~~~~€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€~€€€€€€€€€~~~~~~~~~€€€€€€€€€€€€€€€€€€~~€€€~~~~~~€€€€€€~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~€€€€€€€€€€€€€€€€€€~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€~~~~~~€€€€€€€€€€~~~€€~€€€€€€€€€€€€€€€€€€€€€€€~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~€€€~~€€€€€€€€€€~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ \ No newline at end of file diff --git a/examples/audio-wave/audio-wave-icon.png b/examples/audio-wave/audio-wave-icon.png deleted file mode 100644 index 6e114692e..000000000 Binary files a/examples/audio-wave/audio-wave-icon.png and /dev/null differ diff --git a/examples/audio-wave/audio-wave.cpp b/examples/audio-wave/audio-wave.cpp deleted file mode 100644 index 055f43c86..000000000 --- a/examples/audio-wave/audio-wave.cpp +++ /dev/null @@ -1,108 +0,0 @@ -#include -#include -#include -#include - -#include "audio-wave.hpp" - -#include "assets.hpp" - -/* - Wave example: - - An example of an arbitrary waveform being played through the blit speaker. - - This example, a runthrough: - - Audio data: - The audio file has been converted to 22050Hz sample rate, then exported without its header. - (If a headered file is used, just read past that first. Try skipping the first 44 bytes). - You would preferably store files separate because uncompressed audio will use all your flash! - Here though, the raw wave to a c header using 'xxd -i glass.raw glass.h' - - As the data could be long, or even infinite, we can fill the audio buffer via a callback. - - Calling channels[n].trigger_attack() will run the playback and callback continuously until - either channels[n].trigger_release() or channels[n].off() is called. - - -*/ - - - -using namespace blit; - -void buff_callback(AudioChannel &); //Declare our callback here instead of putting the whole thing here. - -/* setup */ -void init() { - - // Setup channel - channels[0].waveforms = Waveform::WAVE; // Set type to WAVE - channels[0].wave_buffer_callback = &buff_callback; // Set callback address - - screen.pen = Pen(0, 0, 0, 255); - screen.clear(); -} - - -// Static wave config -static uint32_t wav_size = 0; -static uint16_t wav_pos = 0; -static uint16_t wav_sample_rate = 0; -static const uint8_t *wav_sample; - - -// Called everytime audio buffer ends -void buff_callback(AudioChannel &channel) { - - // Copy 64 bytes to the channel audio buffer - for (int x = 0; x < 64; x++) { - // If current sample position is greater than the sample length, fill the rest of the buffer with zeros. - // Note: The sample used here has an offset, so we adjust by 0x7f. - channel.wave_buffer[x] = (wav_pos < wav_size) ? (wav_sample[wav_pos] << 8) - 0x7f00 : 0; - - // As the engine is 22050Hz, we can timestretch to match by incrementing our sample every other step (every even 'x') - if (wav_sample_rate == 11025) { - if (x % 2) wav_pos++; - } else { - wav_pos++; - } - } - - // For this example, clear the values - if (wav_pos >= wav_size) { - channel.off(); // Stop playback of this channel. - //Clear buffer - wav_sample = nullptr; - wav_size = 0; - wav_pos = 0; - wav_sample_rate = 0; - } -} - -void render(uint32_t time_ms) { - screen.pen = Pen(0, 0, 0); - screen.clear(); - - screen.alpha = 255; - screen.pen = Pen(255, 255, 255); - screen.rectangle(Rect(0, 0, 320, 14)); - screen.pen = Pen(0, 0, 0); - screen.text("Wave Example", minimal_font, Point(5, 4)); - - screen.pen = Pen(64, 64, 64); - screen.text("Press A to break screen.", minimal_font, Point(20, 60)); -} - -void update(uint32_t time_ms) { - bool button_a = blit::buttons & blit::Button::A; - - // If 'A' button pushed - if(button_a){ - wav_sample = glass_wav; // Set sample to the array in assets.hpp - wav_size = glass_wav_length; // Set the array length to the value in assets.hpp - channels[0].trigger_attack(); // Start the playback. - } -} - diff --git a/examples/audio-wave/audio-wave.hpp b/examples/audio-wave/audio-wave.hpp deleted file mode 100644 index 21d2d7a39..000000000 --- a/examples/audio-wave/audio-wave.hpp +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#include - -#include "32blit.hpp" - -void init(); -void update(uint32_t time); -void render(uint32_t time); - - diff --git a/examples/audio-wave/audio-wave.png b/examples/audio-wave/audio-wave.png deleted file mode 100644 index e3d20d5bc..000000000 Binary files a/examples/audio-wave/audio-wave.png and /dev/null differ diff --git a/examples/audio-wave/metadata.yml b/examples/audio-wave/metadata.yml deleted file mode 100644 index f728739d9..000000000 --- a/examples/audio-wave/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Audio Wave -description: A simple demo of arbitrary waveform audio. Press a button to hear a glass smash sound. -author: tinwhisker -splash: - file: audio-wave.png -icon: - file: audio-wave-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo \ No newline at end of file diff --git a/examples/doom-fire/CMakeLists.txt b/examples/doom-fire/CMakeLists.txt deleted file mode 100644 index a8a5b73ca..000000000 --- a/examples/doom-fire/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (doom-fire) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (doom-fire doom-fire.cpp) -blit_metadata (doom-fire metadata.yml) diff --git a/examples/doom-fire/doom-fire-icon.png b/examples/doom-fire/doom-fire-icon.png deleted file mode 100644 index 8712448e3..000000000 Binary files a/examples/doom-fire/doom-fire-icon.png and /dev/null differ diff --git a/examples/doom-fire/doom-fire.cpp b/examples/doom-fire/doom-fire.cpp deleted file mode 100644 index f7b1f7a63..000000000 --- a/examples/doom-fire/doom-fire.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - * An example that implements the "Doom Fire", as documented by Fabien - * Sanglard: http://fabiensanglard.net/doom_fire_psx/ - * - */ -#include -#include -#include -#include - -#include "doom-fire.hpp" - -using namespace blit; - -const uint16_t screen_width = 320; -const uint16_t screen_height = 240; -const uint32_t FPS = 1000 / 27; // DoomFire runs at 27FPS. - -Pen palette[] = { // 36 colours - Pen(0x07, 0x07, 0x07), Pen(0x1f, 0x07, 0x07), Pen(0x2f, 0x0f, 0x07), - Pen(0x47, 0x0f, 0x07), Pen(0x57, 0x17, 0x07), Pen(0x67, 0x1f, 0x07), - Pen(0x77, 0x1f, 0x07), Pen(0x8f, 0x27, 0x07), Pen(0x9f, 0x2f, 0x07), - Pen(0xaf, 0x3f, 0x07), Pen(0xbf, 0x47, 0x07), Pen(0xc7, 0x47, 0x07), - Pen(0xDF, 0x4F, 0x07), Pen(0xDF, 0x57, 0x07), Pen(0xDF, 0x57, 0x07), - Pen(0xD7, 0x5F, 0x07), Pen(0xD7, 0x67, 0x0F), Pen(0xcf, 0x6f, 0x0f), - Pen(0xcf, 0x77, 0x0f), Pen(0xcf, 0x7f, 0x0f), Pen(0xCF, 0x87, 0x17), - Pen(0xC7, 0x87, 0x17), Pen(0xC7, 0x8F, 0x17), Pen(0xC7, 0x97, 0x1F), - Pen(0xBF, 0x9F, 0x1F), Pen(0xBF, 0x9F, 0x1F), Pen(0xBF, 0xA7, 0x27), - Pen(0xBF, 0xA7, 0x27), Pen(0xBF, 0xAF, 0x2F), Pen(0xB7, 0xAF, 0x2F), - Pen(0xB7, 0xB7, 0x2F), Pen(0xB7, 0xB7, 0x37), Pen(0xCF, 0xCF, 0x6F), - Pen(0xDF, 0xDF, 0x9F), Pen(0xEF, 0xEF, 0xC7), Pen(0xFF, 0xFF, 0xFF) -}; - -uint8_t fire[screen_width * screen_height]; -uint32_t last_time = 0; -int8_t wind = 0; -bool enabled = true; - -uint32_t posAt(uint32_t x, uint32_t y) { - return y * screen_width + x; -} - -void init() { - blit::set_screen_mode(ScreenMode::hires); - - screen.pen = Pen(0, 0, 0, 255); - screen.clear(); - - // Initialises the screen - for (int x = 0; x < screen_width; x++) { - for (int y = 0; y < screen_height; y++) { - uint32_t pos = posAt(x, y); - fire[pos] = 0; - } - } - - // Initialises the bottom line - for (int i = 0; i < screen_width; i++) { - uint32_t pos = posAt(i, screen_height - 1); - fire[pos] = 35; - } -} - -void update(uint32_t time) { - // Adds wind to east. - if (buttons.pressed & Button::DPAD_LEFT) { - wind--; - } - - // Adds wind to east. - if (buttons.pressed & Button::DPAD_RIGHT) { - wind++; - } - - // Toggles fire on and off. - if (buttons.pressed & Button::X) { - uint8_t fire_index = enabled ? 0 : 35; - for (int i = 0; i < screen_width; i++) { - uint32_t pos = posAt(i, screen_height - 1); - fire[pos] = fire_index; - } - enabled = !enabled; - } -} - -void render(uint32_t time) { - if (time - last_time < FPS) { - return; - } - last_time = time; - for (int y = 0; y < screen_height; y++) { - // Precompute the rows for a small performance gain. - int row = y * screen_width; - - // For each pixel in each row, calculate the colours that will be - // rendered on the previous row, on the next call to update. - int next_row = y == 0 ? 0 : (y - 1) * screen_width; - - for (int x = 0; x < screen_width; x++) { - // Draw the current pixel. - uint8_t color = fire[row + x]; - screen.pen = palette[color]; - screen.pixel(Point(x, y)); - - // Update the pixels on the previous row. - if (y > 0) { - int new_x = x; - int rand = std::rand() % 3; - new_x = (new_x + rand - 1 + wind); - if (new_x >= screen_width) { - new_x = new_x - screen_width; - } - else if (new_x < 0) { - new_x = new_x + screen_width; - } - color = color > 0 ? color - (rand & 1) : 0; - fire[next_row + new_x] = color; - } - } - } -} diff --git a/examples/doom-fire/doom-fire.hpp b/examples/doom-fire/doom-fire.hpp deleted file mode 100644 index b791bb454..000000000 --- a/examples/doom-fire/doom-fire.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include - -#include "32blit.hpp" - -void init(); -void update(uint32_t time); -void render(uint32_t time); \ No newline at end of file diff --git a/examples/doom-fire/doom-fire.png b/examples/doom-fire/doom-fire.png deleted file mode 100644 index 064868447..000000000 Binary files a/examples/doom-fire/doom-fire.png and /dev/null differ diff --git a/examples/doom-fire/metadata.yml b/examples/doom-fire/metadata.yml deleted file mode 100644 index 4a8d298b2..000000000 --- a/examples/doom-fire/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Doom Fire -description: The classic cellular automata animated pixel fire effect from the Final DOOM console port. -author: andreban -splash: - file: doom-fire.png -icon: - file: doom-fire-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo \ No newline at end of file diff --git a/examples/fizzlefade/CMakeLists.txt b/examples/fizzlefade/CMakeLists.txt deleted file mode 100644 index e8e248121..000000000 --- a/examples/fizzlefade/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (fizzlefade) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (fizzlefade fizzlefade.cpp) -blit_metadata (fizzlefade metadata.yml) diff --git a/examples/fizzlefade/fizzlefade.cpp b/examples/fizzlefade/fizzlefade.cpp deleted file mode 100644 index 5e9506df1..000000000 --- a/examples/fizzlefade/fizzlefade.cpp +++ /dev/null @@ -1,90 +0,0 @@ - -#include -#include -#include -#include <32blit.hpp> - -#include "fizzlefade.hpp" - -using namespace blit; - -#define FADE_STEPS 3 - -Pen fade_to[FADE_STEPS]{ - Pen(128, 64, 15, 64), - Pen(15, 128, 15, 64), - Pen(15, 64, 128, 64) -}; - -uint16_t taps[FADE_STEPS]{ - 0x74b8, - 0x50e7, - 0x6000 -}; - -int8_t fade_current = 0; - -/* setup */ -void init() { - set_screen_mode(ScreenMode::lores); - - screen.alpha = 255; - screen.mask = nullptr; - Pen p = fade_to[FADE_STEPS - 1]; - p.a = 255; - screen.pen = p; - screen.clear(); - - screen.pen = fade_to[0]; -} - -uint32_t lfsr = 1; -uint16_t tap = 0x74b8; -Point fizzlefade() { - uint16_t x = lfsr & 0x00ff; - uint16_t y = (lfsr & 0x7f00) >> 8; - - uint8_t lsb = lfsr & 1; - lfsr >>= 1; - - if (lsb) { - lfsr ^= tap; - } - - if (x - 1 < 160 && y < 120) { - return Point(x - 1, y); - } - - return Point(-1, -1); -} - -void render(uint32_t time_ms) { - uint32_t ms_start = now(); - - screen.pen = fade_to[fade_current]; - - for (int c = 0; c < 500; c++) { - Point ff = fizzlefade(); - if (ff.x > -1) { - screen.pixel(ff); - } - if (lfsr == 1) { - fade_current += 1; - fade_current %= FADE_STEPS; - tap = taps[fade_current]; - break; - } - } - - uint32_t ms_end = now(); - screen.mask = nullptr; - screen.pen = Pen(255, 0, 0); - for (uint32_t i = 0; i < (ms_end - ms_start); i++) { - screen.pen = Pen(i * 5, 255 - (i * 5), 0); - screen.rectangle(Rect(i * 3 + 1, 117, 2, 2)); - } -} - -void update(uint32_t time) { - -} diff --git a/examples/fizzlefade/fizzlefade.hpp b/examples/fizzlefade/fizzlefade.hpp deleted file mode 100644 index e81a4cdf8..000000000 --- a/examples/fizzlefade/fizzlefade.hpp +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -#include - -#include "32blit.hpp" - - - void init(); - void update(uint32_t time); - void render(uint32_t time); diff --git a/examples/fizzlefade/metadata.yml b/examples/fizzlefade/metadata.yml deleted file mode 100644 index 801f22176..000000000 --- a/examples/fizzlefade/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Fizzlefade -description: The classic fizzle fade screen transition effect using a LFSR. -author: pimoroni -splash: - file: ../no-image.png -icon: - file: ../no-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo \ No newline at end of file diff --git a/examples/flight/CMakeLists.txt b/examples/flight/CMakeLists.txt deleted file mode 100644 index d5685a88e..000000000 --- a/examples/flight/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (flight) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) - -if(32BLIT_PICO) - # This example uses too much RAM (at run time) - return() -endif() - -blit_executable (flight flight.cpp) -blit_assets_yaml (flight assets.yml) -blit_metadata (flight metadata.yml) diff --git a/examples/flight/assets.yml b/examples/flight/assets.yml deleted file mode 100644 index 6edd2599e..000000000 --- a/examples/flight/assets.yml +++ /dev/null @@ -1,6 +0,0 @@ -assets.cpp: - assets/flight.png: - name: packed_data - - assets/water.png: - name: water_packed_data diff --git a/examples/flight/assets/flight.png b/examples/flight/assets/flight.png deleted file mode 100644 index 3eeab0716..000000000 Binary files a/examples/flight/assets/flight.png and /dev/null differ diff --git a/examples/flight/assets/water.png b/examples/flight/assets/water.png deleted file mode 100644 index f7b96d5b3..000000000 Binary files a/examples/flight/assets/water.png and /dev/null differ diff --git a/examples/flight/flight.cpp b/examples/flight/flight.cpp deleted file mode 100644 index 718923229..000000000 --- a/examples/flight/flight.cpp +++ /dev/null @@ -1,313 +0,0 @@ - -#include -#include -#include -#include - -#include "graphics/mode7.hpp" - -#include "flight.hpp" -#include "assets.hpp" - -using namespace blit; - -// extra space allocated to take mipmaps -// mipmaps are stored as Pen since they're the blended result of scaling the paletted image data -uint8_t __sprites[(128 * 128) + (64 * 128 * sizeof(Pen))]; - -// storage for the water spritesheet -uint8_t __water[64 * 64]; - -/* create surfaces */ -Surface *sprites; -Surface *water; - -Map map(Rect(0, 0, 128, 128)); - -struct object { - Vec2 pos; - uint8_t type; - - object(Vec2 pos, uint8_t type) : pos(pos), type(type) {} -}; - -struct DrawObject { - object o; - float dist; - Vec2 vs; - - DrawObject(object obj, float dist, Vec2 vs): o(obj), dist(dist), vs(vs) {} - - bool operator< (const DrawObject &other) const { - return other.dist < dist; - } -}; - -std::vector objects; - -static Vec2 vel(0, 0); -static float angle = -15.0f * (pi / 180.0f); -Vec2 pos(512, 512); - -float map_size = 128; -float fov = 95.0f * (pi / 180.0f); -float far = 500.0f; -float near = 10.0f; -float is_starting = false; - -float deg2rad(float a) { - return a * (pi / 180.0f); -} - -float rad2deg(float r) { - return r * (180.0f / pi); -} - -void init() { - map.add_layer("ground", layer); - map.layers["ground"].transforms = layer_transforms; - - // Load our map sprites into the __sprites space we've reserved - sprites = Surface::load(packed_data, __sprites, sizeof(__sprites)); - sprites->generate_mipmaps(3); - - water = Surface::load(water_packed_data, __water, sizeof(__water)); - - // extract information about objects from the map data - Point p; - for (p.y = 0; p.y < 128; p.y++) { - for (p.x = 0; p.x < 128; p.x++) { - int16_t tid = map.layers["ground"].tile_at(p); - if (tid == 27) { - objects.emplace_back( - Vec2(p.x * 8 + 4, p.y * 8 + 4), - 1 - ); - } - if (tid == 28) { - objects.emplace_back( - Vec2(p.x * 8 + 4, p.y * 8 + 4), - 2 - ); - } - if (tid == 29) { - objects.emplace_back( - Vec2(p.x * 8 + 4, p.y * 8 + 4), - 3 - ); - } - if (tid == 30) { - objects.emplace_back( - Vec2(p.x * 8 + 4, p.y * 8 + 4), - 4 - ); - } - } - } -} - -/* get normalised value off 255 for the dist of object between the above values. - So if min is 300 and max is 800, if the distance is 400, we would want to get a scale of the alpha -*/ -float calculateFadeAlpha (const int maxDist, const int minDist, float dist) { - int range = maxDist - minDist; - int n = dist - minDist; - float percentage = n / float(range); - return 1.0f - (255.0f * percentage); -} - -Rect vp(0, 50, 160, 120 - 50); - -// returns vector of objects that are viewable -std::vector drawObjects (std::vector objects) { - std::vector vect; - - for (auto o : objects) { - Vec2 vo = (o.pos - pos); - vo.normalize(); - Vec2 forward(0, -1); - forward *= Mat3::rotation(angle); - - // TODO: provide a "is_point_in_frustrum" check - if(forward.dot(vo) > 0) { // check if object is in front of us - Vec2 vs = world_to_screen(o.pos, fov, angle, pos, near, far, vp); - float dist = (o.pos - pos).length(); - - vect.push_back(DrawObject(o,dist,vs)); - } - } - - return vect; -} - -void render(uint32_t time_ms) { - static int tick_count = 0; tick_count++; - - screen.alpha = 255; - screen.mask = nullptr; - screen.pen = Pen(99, 155, 255); - screen.rectangle(Rect(0, 0, 160, 50)); - - screen.pen = Pen(91, 110, 225); - screen.rectangle(Rect(0, 50, 160, 120 - 50)); - uint32_t ms_start = now(); - - screen.alpha = 55; - - for (uint8_t y = 50; y < 120; y += 64) { - for (uint8_t x = 0; x < 160; x += 64) { - screen.blit(water, Rect(0, 0, 64, 64), Point(x, y)); - } - } - - mode7(&screen, sprites, &map.layers["ground"], fov, angle, pos, near, far, vp); - - std::vector drawables = drawObjects(objects); - std::sort(drawables.begin(), drawables.end()); // sort them so they draw in order - - const int maxViewDistance = 600; // draw distance - const int maxClearDistance = 300; // before sprites stop being fully opaque. start to fade out. - - for (DrawObject o : drawables) { - - if (o.dist < float(maxViewDistance)) { // check if the object is in a reasonable distance - - if (o.dist > maxClearDistance) { - screen.alpha = calculateFadeAlpha(maxViewDistance, maxClearDistance, o.dist); - } else { - screen.alpha = 255.0f; - } - - Rect sr(120, 112, 8, 16); - - float scale = 200.0f / o.dist; - - Rect dr(o.vs - Point(4, 15) * scale, sr.size() * scale); - - screen.stretch_blit(sprites, sr, dr); - } - } - - uint32_t ms_end = now(); - - // Orientation debug info - screen.alpha = 255; - screen.pen = Pen(255, 255, 255); - screen.text("N: " + std::to_string(int(near)) + " - F:" + std::to_string(int(far)), minimal_font, Rect(0, 0, 100, 10)); - screen.text("X: " + std::to_string(int(pos.x)) + " - Y:" + std::to_string(int(pos.y)), minimal_font, Rect(0, 10, 100, 10)); - screen.text("A: " + std::to_string(int(rad2deg(angle))), minimal_font, Rect(0, 20, 100, 10)); - - // draw the mini map - screen.alpha = 200; - screen.pen = Pen(0, 0, 0, 100); - screen.rectangle(Rect(160 - 64, 120 - 64, 64, 64)); - Vec2 mmp; - for (mmp.y = 0; mmp.y < 64; mmp.y++) { - for (mmp.x = 0; mmp.x < 64; mmp.x++) { - Point tp = mmp * 2.0f; - - int16_t tile_id = map.layers["ground"].tile_at(tp) - 1; - - if (tile_id != -1) { - Point sp( - (tile_id & 0b1111), - (tile_id / 16) - ); // sprite sheet coordinates - - Pen *spr = (Pen *)sprites->mipmaps[2]->data; - Pen *mmv = &spr[sp.x + sp.y * 16]; - screen.pen = *mmv; - screen.pixel(mmp + Vec2(160 - 64, 120 - 64)); - } - } - } - - Vec2 mmpos = (pos / 16.0f) + Vec2(160 - 64, 120 - 64); - screen.pen = Pen(255, 255, 255); - screen.pixel(mmpos); - - Vec2 mtpos = (Vec2(400, 400) / 16.0f) + Vec2(160 - 64, 120 - 64); - screen.pen = Pen(0, 255, 255); - screen.pixel(mtpos); - - Vec2 forward(0, -10); - forward *= Mat3::rotation(angle); - screen.pen = Pen(255, 255, 255, 100); - screen.line(mmpos, mmpos + forward); - - // draw FPS meter - screen.alpha = 255; - screen.pen = Pen(255, 255, 255, 100); - screen.rectangle(Rect(1, 120 - 10, 12, 9)); - screen.pen = Pen(255, 255, 255, 200); - std::string fms = std::to_string(ms_end - ms_start); - screen.text(fms, minimal_font, Rect(3, 120 - 9, 10, 16)); - - int block_size = 4; - for (uint32_t i = 0; i < (ms_end - ms_start); i++) { - screen.pen = Pen(i * 5, 255 - (i * 5), 0); - screen.rectangle(Rect(i * (block_size + 1) + 1 + 13, screen.bounds.h - block_size - 1, block_size, block_size)); - } -} - -bool compare (float v1, float v2) { - return fabsf(v1 - v2) < 0.001f; -} - -bool is_off_ground () { - return !compare(500.0f, far); -} - -float lerping(float a, float b, float f) { - return a + f * (b - a); -} - -void update(uint32_t time) { - - static float angle_delta = 0.0f; - float target_speed; - float lerp_value = 0.002f; - - if (pressed(Button::DPAD_LEFT)) { angle_delta -= 0.025f; } - if (pressed(Button::DPAD_RIGHT)) { angle_delta += 0.025f; } - - angle_delta += joystick.x / 40.0f; - - // Clamp angle_delta - // This stops the user from turning faster by using the DPAD and joystick at the same time - if (angle_delta > 0.5f) { angle_delta = 0.5f; } - else if (angle_delta < -0.5f) { angle_delta = -0.5f; } - - if (pressed(Button::Y)) { - // boost button - target_speed = is_off_ground() ? 2.0f : 0.5f; - } else { - target_speed = is_off_ground() ? 0.8f : 0.0f; - } - - if (pressed(Button::X)) { - // break button - target_speed = is_off_ground() ? 0.5f : 0.0f; - - if (!is_off_ground()) { - lerp_value *= 5.0f; - } - } - - angle += deg2rad(angle_delta); - Mat3 r = Mat3::rotation(angle); - pos = pos - (vel * r); - - if (pressed(Button::A) || (joystick.y > 0.0f)) { - far = far + (far * 0.01f); - } - if (pressed(Button::B) || (joystick.y < 0.0f)) { - far = far - (far * 0.01f); - far = std::max(far,500.0f); - } - - angle_delta *= 0.95f; - - vel.y = lerping(vel.y, target_speed, 0.002f); - -} diff --git a/examples/flight/flight.hpp b/examples/flight/flight.hpp deleted file mode 100644 index ee9ef45d7..000000000 --- a/examples/flight/flight.hpp +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include - -#include "32blit.hpp" - - - void init(); - void update(uint32_t time); - void render(uint32_t time); - - static const std::vector layer = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 13, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 13, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 13, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 13, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 13, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 27, 15, 15, 27, 27, 16, 13, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 13, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 13, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 27, 15, 15, 15, 27, 15, 27, 15, 15, 15, 15, 27, 15, 15, 13, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 13, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 15, 15, 27, 27, 15, 15, 15, 15, 15, 15, 16, 13, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 27, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 13, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 16, 13, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 15, 15, 27, 15, 15, 15, 27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 13, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 15, 15, 15, 13, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 15, 13, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 27, 15, 15, 15, 15, 27, 15, 16, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 30, 15, 30, 15, 30, 15, 30, 15, 30, 15, 30, 15, 30, 15, 30, 15, 30, 15, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 13, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 15, 27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 27, 15, 27, 27, 15, 15, 27, 15, 15, 13, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 27, 15, 15, 15, 15, 16, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 15, 15, 15, 15, 15, 13, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 11, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 27, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 15, 15, 15, 15, 27, 27, 15, 15, 27, 15, 15, 15, 27, 15, 15, 15, 15, 15, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 28, 15, 15, 29, 16, 11, 19, 1, 14, 1, 14, 1, 14, 14, 14, 1, 14, 1, 14, 1, 19, 11, 16, 29, 28, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 28, 15, 16, 11, 19, 1, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 1, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 14, 1, 7, 2, 2, 2, 2, 2, 2, 2, 7, 1, 14, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 27, 15, 27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 29, 16, 11, 19, 1, 14, 7, 2, 2, 2, 2, 2, 2, 2, 7, 14, 1, 19, 11, 16, 29, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 28, 15, 15, 15, 16, 11, 19, 14, 1, 7, 14, 14, 14, 14, 14, 14, 14, 7, 1, 14, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 1, 14, 7, 14, 14, 14, 10, 14, 14, 14, 7, 14, 1, 19, 11, 16, 15, 28, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 30, 15, 15, 16, 11, 19, 14, 1, 7, 14, 14, 14, 14, 14, 14, 14, 7, 1, 14, 19, 11, 16, 15, 16, 11, 19, 8, 14, 17, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 27, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 29, 16, 11, 19, 1, 14, 7, 14, 14, 14, 8, 14, 14, 14, 7, 14, 1, 19, 11, 16, 29, 16, 11, 19, 8, 14, 17, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 28, 15, 16, 11, 19, 14, 1, 7, 14, 14, 14, 8, 14, 14, 14, 7, 1, 14, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 1, 14, 7, 14, 4, 14, 8, 14, 4, 14, 7, 14, 1, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 14, 1, 7, 14, 4, 14, 8, 14, 4, 14, 7, 1, 14, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 28, 15, 15, 15, 29, 16, 11, 19, 1, 14, 7, 14, 14, 14, 8, 14, 14, 14, 7, 14, 1, 19, 11, 16, 29, 28, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 14, 1, 7, 14, 14, 14, 8, 14, 14, 14, 7, 1, 14, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 1, 14, 7, 14, 6, 14, 8, 14, 6, 14, 7, 14, 1, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 14, 1, 7, 14, 6, 14, 8, 14, 6, 14, 7, 1, 14, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 30, 15, 28, 15, 29, 16, 11, 19, 1, 14, 7, 14, 14, 14, 8, 14, 14, 14, 7, 14, 1, 19, 11, 16, 29, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 14, 1, 7, 14, 14, 14, 8, 14, 14, 14, 7, 1, 14, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 28, 15, 15, 15, 15, 15, 16, 11, 19, 1, 14, 7, 14, 7, 14, 8, 14, 7, 14, 7, 14, 1, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 14, 1, 7, 14, 7, 14, 8, 14, 7, 14, 7, 1, 14, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 28, 15, 29, 16, 11, 19, 1, 14, 7, 14, 14, 14, 8, 14, 14, 14, 7, 14, 1, 19, 11, 16, 29, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 28, 15, 15, 15, 15, 16, 11, 19, 14, 1, 7, 14, 14, 14, 8, 14, 14, 14, 7, 1, 14, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 1, 14, 7, 14, 17, 14, 8, 14, 17, 14, 7, 14, 1, 19, 11, 16, 15, 16, 11, 19, 8, 14, 17, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 28, 15, 15, 15, 15, 16, 11, 19, 14, 1, 7, 14, 17, 14, 8, 14, 17, 14, 7, 1, 14, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 28, 29, 16, 11, 19, 1, 14, 7, 14, 17, 14, 8, 14, 17, 14, 7, 14, 1, 19, 11, 16, 29, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 28, 15, 15, 15, 16, 11, 19, 14, 1, 7, 14, 14, 14, 8, 14, 14, 14, 7, 1, 14, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 1, 14, 7, 14, 14, 14, 8, 14, 17, 14, 7, 14, 1, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 14, 1, 7, 14, 17, 14, 8, 14, 17, 14, 7, 1, 14, 19, 11, 16, 15, 28, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 29, 16, 11, 19, 1, 14, 7, 14, 14, 14, 8, 14, 14, 14, 7, 14, 1, 19, 11, 16, 29, 16, 11, 19, 8, 17, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 14, 1, 7, 14, 17, 14, 8, 14, 14, 14, 7, 1, 14, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 1, 14, 7, 14, 14, 14, 8, 14, 14, 14, 7, 14, 1, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 30, 15, 15, 16, 11, 19, 14, 1, 7, 14, 14, 14, 8, 14, 17, 14, 7, 1, 14, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 29, 16, 11, 19, 1, 14, 7, 14, 17, 14, 8, 14, 14, 14, 7, 14, 1, 19, 11, 16, 29, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 14, 1, 7, 14, 14, 14, 8, 14, 14, 14, 7, 1, 14, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 14, 1, 7, 14, 14, 14, 8, 14, 14, 14, 7, 1, 14, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 1, 14, 7, 14, 17, 14, 8, 14, 17, 14, 7, 14, 1, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 13, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 29, 16, 11, 19, 14, 1, 7, 14, 14, 14, 8, 14, 14, 14, 7, 1, 14, 19, 11, 16, 29, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 1, 14, 7, 14, 17, 14, 8, 14, 17, 14, 7, 14, 1, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 14, 1, 7, 14, 17, 14, 8, 14, 17, 14, 7, 1, 14, 19, 11, 16, 28, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 1, 14, 7, 14, 17, 14, 8, 14, 17, 14, 7, 14, 1, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 30, 15, 15, 15, 15, 29, 16, 11, 19, 14, 1, 7, 14, 17, 14, 8, 14, 17, 14, 7, 1, 14, 19, 11, 16, 29, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 13, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 1, 14, 7, 14, 17, 14, 8, 14, 17, 14, 7, 14, 1, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 14, 1, 7, 14, 17, 14, 8, 14, 17, 14, 7, 1, 14, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 1, 14, 7, 14, 14, 14, 8, 14, 14, 14, 7, 14, 1, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 13, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 29, 16, 11, 19, 14, 1, 7, 14, 14, 14, 8, 14, 14, 14, 7, 1, 14, 19, 11, 16, 29, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 1, 14, 7, 14, 17, 14, 8, 14, 17, 14, 7, 14, 1, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 13, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 30, 15, 15, 15, 15, 16, 11, 19, 14, 1, 7, 14, 17, 14, 8, 14, 17, 14, 7, 1, 14, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 1, 14, 7, 14, 17, 14, 8, 14, 17, 14, 7, 14, 1, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 13, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 29, 16, 11, 19, 14, 1, 7, 14, 14, 14, 8, 14, 14, 14, 7, 1, 14, 19, 11, 16, 29, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 1, 14, 7, 14, 14, 14, 8, 14, 14, 14, 7, 14, 1, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 30, 15, 15, 15, 16, 11, 19, 14, 1, 7, 14, 7, 14, 8, 14, 7, 14, 7, 1, 14, 19, 11, 28, 15, 16, 11, 19, 8, 14, 17, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 1, 14, 7, 14, 7, 14, 8, 14, 7, 14, 7, 14, 1, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 29, 16, 11, 19, 14, 1, 7, 14, 14, 14, 8, 14, 14, 14, 7, 1, 14, 19, 11, 16, 29, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 30, 15, 16, 11, 19, 1, 14, 7, 14, 14, 14, 8, 14, 14, 14, 7, 14, 1, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 14, 1, 7, 14, 6, 14, 8, 14, 6, 14, 7, 1, 14, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 30, 15, 15, 15, 15, 16, 11, 19, 1, 14, 7, 14, 6, 14, 8, 14, 6, 14, 7, 14, 1, 19, 11, 16, 28, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 29, 16, 11, 19, 14, 1, 7, 14, 14, 14, 8, 14, 14, 14, 7, 1, 14, 19, 11, 16, 15, 16, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 1, 14, 7, 14, 14, 14, 8, 14, 14, 14, 7, 14, 1, 19, 11, 16, 15, 13, 11, 19, 8, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 14, 1, 7, 14, 4, 14, 8, 14, 4, 14, 7, 1, 14, 19, 11, 16, 13, 11, 11, 12, 14, 14, 14, 8, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 30, 15, 15, 15, 16, 11, 19, 1, 14, 7, 14, 4, 14, 8, 14, 4, 14, 7, 14, 1, 19, 11, 11, 11, 11, 12, 14, 14, 14, 14, 14, 19, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 30, 15, 15, 15, 15, 29, 16, 11, 19, 14, 1, 7, 14, 14, 14, 8, 14, 14, 14, 14, 14, 14, 20, 19, 19, 19, 12, 14, 14, 14, 14, 14, 12, 11, 11, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 13, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 1, 14, 7, 14, 14, 14, 8, 14, 14, 14, 14, 14, 14, 4, 14, 6, 14, 14, 14, 14, 14, 14, 12, 11, 11, 13, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 14, 1, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 4, 14, 6, 14, 14, 14, 14, 14, 12, 11, 11, 13, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 30, 15, 16, 11, 19, 1, 14, 7, 14, 14, 14, 9, 14, 14, 14, 14, 14, 14, 4, 14, 6, 14, 14, 14, 14, 12, 11, 11, 13, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 13, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 30, 15, 15, 15, 15, 15, 29, 16, 11, 19, 14, 1, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 4, 14, 6, 14, 14, 14, 12, 11, 11, 13, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 1, 14, 7, 2, 2, 2, 2, 2, 2, 2, 7, 14, 1, 20, 19, 19, 19, 19, 19, 11, 11, 13, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 30, 15, 15, 15, 16, 11, 19, 14, 1, 7, 2, 2, 2, 2, 2, 2, 2, 7, 1, 14, 19, 11, 11, 11, 11, 11, 11, 13, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 1, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 1, 19, 11, 11, 11, 11, 11, 13, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 29, 16, 11, 19, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 19, 11, 11, 11, 11, 13, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 13, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 19, 1, 14, 1, 14, 1, 14, 14, 14, 1, 14, 1, 14, 1, 19, 11, 11, 11, 13, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 13, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 11, 11, 11, 13, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 13, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 13, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 13, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 13, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 13, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 13, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 13, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 13, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 13, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 13, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 13, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; - static const std::vector layer_transforms = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 6, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 4, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 4, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 4, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 4, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 5, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 5, 0, 6, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 6, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; - diff --git a/examples/flight/metadata.yml b/examples/flight/metadata.yml deleted file mode 100644 index e46559008..000000000 --- a/examples/flight/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Flight -description: A mode7 Flight simulator demo. -author: pimoroni -splash: - file: ../no-image.png -icon: - file: ../no-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo \ No newline at end of file diff --git a/examples/geometry/CMakeLists.txt b/examples/geometry/CMakeLists.txt deleted file mode 100644 index 7baaca123..000000000 --- a/examples/geometry/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (geometry) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (geometry geometry.cpp) -blit_metadata (geometry metadata.yml) -blit_assets_yaml (geometry assets.yml) diff --git a/examples/geometry/OFL.txt b/examples/geometry/OFL.txt deleted file mode 100644 index 70881e0c4..000000000 --- a/examples/geometry/OFL.txt +++ /dev/null @@ -1,93 +0,0 @@ -Copyright 2012 The Press Start 2P Project Authors (cody@zone38.net), with Reserved Font Name "Press Start 2P". - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/examples/geometry/assets.yml b/examples/geometry/assets.yml deleted file mode 100644 index 9591f2d22..000000000 --- a/examples/geometry/assets.yml +++ /dev/null @@ -1,9 +0,0 @@ -# This file defines assets used by the example; the standard 32Blit -# pipeline will compile and link these assets into your code. - -font_asset.cpp: - numbers.png: - name: asset_custom_font - type: font/image - height: 13 - diff --git a/examples/geometry/geometry-icon.png b/examples/geometry/geometry-icon.png deleted file mode 100644 index 8b5225475..000000000 Binary files a/examples/geometry/geometry-icon.png and /dev/null differ diff --git a/examples/geometry/geometry.cpp b/examples/geometry/geometry.cpp deleted file mode 100644 index 970dc8e4d..000000000 --- a/examples/geometry/geometry.cpp +++ /dev/null @@ -1,615 +0,0 @@ -#include "geometry.hpp" -#include "font_asset.hpp" - -#include "graphics/color.hpp" -#include "types/vec2.hpp" -#include "engine/particle.hpp" - -using namespace blit; - -const Font custom_font(asset_custom_font); -std::vector particles; -std::vector polygons; - -Player player1; - -void explode(Vec2 origin, float factor=1.0f) { - channels[2].frequency = 800; - channels[2].trigger_attack(); - uint8_t count = 5 + (blit::random() % 25); - count *= factor; - for(auto x = 0u; x < count; x++) { - float r = blit::random() % 360; - float v = (50.0f + (blit::random() % 100)) / 100.0f; - float c = 100 + blit::random() % 128; - r = r * pi / 180.0f; - - particles.push_back(SpaceDust( - origin, - Vec2(cosf(r) * v, sinf(r) * v), - c - )); - } -} - -void thrust(Vec2 origin, Vec2 vel) { - vel.rotate(pi); - for(auto x = 0u; x < 10; x++) { - float r = ((blit::random() % 300) - 150) / 5000.0f; - vel.rotate(r); - particles.push_back(SpaceDust( - origin, - vel, - 255 - )); - } -} - -bool prune_polygons(Polygon p){ - if(p.prune) { - explode(p.origin, p.area / float(ASTEROID_MIN_AREA)); - } - return p.prune; -} - -uint16_t area_of_polygon(std::vector &points) { - auto a = points.back(); - int32_t area = 0; - for (auto b : points) { - area += ((a.x * b.y) - (b.x * a.y)) / 2; - a = b; - } - // Fix for infinitely small poygons shooting to 65535 - return area > 60000 || area < 0 ? 0 : (uint16_t)area; -} - -Vec2 centroid_of_polygon(std::vector &points) { - Vec2 t(0, 0); - for (auto p : points) { - t += p; - } - return t / points.size(); -} - -bool line_segment_intersection(Vec2 *intersection, Vec2 a, Vec2 b, Vec2 c, Vec2 d) { - Vec2 r = b - a; - Vec2 s = d - c; - - float rxs = (r.x * s.y) - (r.y * s.x); - float u = ((c.x - a.x) * r.y - (c.y - a.y) * r.x) / rxs; - float t = ((c.x - a.x) * s.y - (c.y - a.y) * s.x) / rxs; - - if (0 <= u && u <= 1 && 0 <= t && t <= 1) { - *intersection = a + (r * t); - return true; - } - - return false; -} - -Polygon split_polygon(Polygon *poly, Vec2 a, Vec2 b) { - std::vector split_a; - std::vector split_b; - std::vector split_line_segment; - - Vec2 last_point = poly->points.back(); - - for (auto &p : poly->points) { - float bside = ((p.x - a.x) * (b.y - a.y)) - ((p.y - a.y) * (b.x - a.x)); - float last_bside = ((last_point.x - a.x) * (b.y - a.y)) - ((last_point.y - a.y) * (b.x - a.x)); - - // If our polygon line croses out intersection line, create a new point along the intersection for each new polygon - if (bside != last_bside) { - Vec2 intersection; - if (line_segment_intersection(&intersection, last_point, p, a, b)) { - split_a.push_back(intersection); - split_b.push_back(intersection); - split_line_segment.push_back(intersection); - explode(Vec2(intersection.x, intersection.y), 0.25f); - } - } - - if (bside > 0) { - split_a.push_back(p); - } - else { - split_b.push_back(p); - } - - last_point = p; - } - - // If we don't encounter two line segment intersections, we're shooting from *inside* an asteroid - if (split_b.size() > 0 && split_line_segment.size() == 2) { - - poly->points = std::vector(split_a); - poly->origin = centroid_of_polygon(poly->points); - //poly->rotational_velocity += 0.005f; - poly->area = area_of_polygon(poly->points); - - if(poly->area < ASTEROID_MIN_AREA) { - player1.score += poly->area; - poly->prune = true; - } else { - poly->prune = false; - } - - float area = area_of_polygon(split_b); - Vec2 midpoint = split_line_segment.front() + split_line_segment.back(); - midpoint /= 2.0f; - Vec2 original_velocity = poly->velocity; - - poly->velocity = poly->origin - midpoint; - poly->velocity.normalize(); - poly->velocity *= 0.1f; - poly->velocity += original_velocity; - poly->rotational_velocity = poly->origin.angle(midpoint) * 0.1f; - - if(area >= ASTEROID_MIN_AREA) { - - Polygon new_polygon; - new_polygon.colour_offset = poly->colour_offset; - new_polygon.points = std::vector(split_b); - new_polygon.origin = centroid_of_polygon(new_polygon.points); - - // Push the new asteroid half away from the "cut" - new_polygon.velocity = new_polygon.origin - midpoint; - new_polygon.velocity.normalize(); - new_polygon.velocity *= 0.1f; - new_polygon.velocity += original_velocity; - - new_polygon.rotational_velocity = new_polygon.origin.angle(midpoint) * 0.1f; - - new_polygon.area = area; - return new_polygon; - } - else { - player1.score += area; - // This polygon doesn't ever exist, but since we have the list - // of points and its bounds we can emenate an explosion from its center - explode(centroid_of_polygon(split_b), area / float(ASTEROID_MIN_AREA)); - } - } - - return Polygon(); -} - -void draw_polygon(std::vector &points) { - Vec2 last_point = points.back(); - for (auto &p : points) { - screen.line(last_point, p); - last_point = p; - } -} - -std::vector random_convex_polygon(Vec2 origin, float radius) { - unsigned int count = (blit::random() % 7) + 3; - origin += Vec2(radius, radius); - std::vector angles; - for (auto a = 0u; a < count; a++) { - angles.push_back(float(blit::random() % 360) * pi / (float)180); - } - std::sort(angles.begin(), angles.end()); - std::vector points; - for (auto &angle : angles) { - Vec2 p = Vec2(0, -radius); - p.rotate(angle); - points.push_back(p + origin); - } - return points; -} - -void rotate_polygon(std::vector &points, float angle, Vec2 origin) { - Mat3 t = Mat3::identity(); - t *= Mat3::translation(origin); - t *= Mat3::rotation(-angle); - t *= Mat3::translation(-origin); - for (auto &p : points) { - p *= t; - } -} - -void translate_polygon(Polygon &polygon, Vec2 translation) { - Mat3 t = Mat3::identity(); - t *= Mat3::translation(translation); - for (auto &p : polygon.points) { - p *= t; - } - polygon.origin *= t; -} - -void translate_polygon(std::vector &points, Vec2 translation) { - Mat3 t = Mat3::identity(); - t *= Mat3::translation(translation); - for (auto &p : points) { - p *= t; - } -} - -float random_float_between(float a, float b) { - float r = float(blit::random() - INT32_MAX) / float(INT32_MAX); - return a + r * (b - a); -} - -void reset() { - polygons.clear(); - - for(unsigned int i = 0; i < ASTEROID_COUNT; i++){ - Polygon p; - float x = random_float_between(0, screen.bounds.w); - float y = random_float_between(0, screen.bounds.h); - //float x = screen.bounds.w / 2; - //float y = screen.bounds.h / 2; - float r = (blit::random() % (ASTEROID_MAX_R - ASTEROID_MIN_R)) + ASTEROID_MIN_R; - float vx = random_float_between(-0.1f, 0.1f); - float vy = random_float_between(-0.1f, 0.1f); - p.colour_offset = random_float_between(0.0f, 1.0f); - p.points = random_convex_polygon(Vec2(x, y), r); - p.velocity = Vec2(vx, vy); - p.origin = centroid_of_polygon(p.points); - p.rotational_velocity = random_float_between(-0.002f, 0.002f); - p.area = area_of_polygon(p.points); - polygons.push_back(p); - } -} - -void init() { - set_screen_mode(ScreenMode::hires); - - player1.shape.push_back(Vec2(0, -6)); - player1.shape.push_back(Vec2(-6, 6)); - player1.shape.push_back(Vec2(0, 2)); - player1.shape.push_back(Vec2(6, 6)); - -#ifdef __AUDIO__ - channels[0].waveforms = Waveform::NOISE; - channels[0].frequency = 4200; - channels[0].attack_ms = 10; - channels[0].decay_ms = 1; - channels[0].sustain = 0xffff; - channels[0].release_ms = 10; - channels[0].volume = 4000; - - channels[1].waveforms = Waveform::SQUARE | Waveform::SINE; - channels[1].frequency = 0; - channels[1].attack_ms = 10; - channels[1].decay_ms = 500; - channels[1].sustain = 0; - channels[1].release_ms = 0; - channels[1].volume = 3000; - - channels[2].waveforms = Waveform::NOISE; - channels[2].frequency = 800; - channels[2].attack_ms = 10; - channels[2].decay_ms = 500; - channels[2].sustain = 0; - channels[2].release_ms = 0; - channels[2].volume = 8000; -#endif - - player1.reset_or_die(); - reset(); -} - -void render(uint32_t time) { -#ifdef __DEBUG__ - uint32_t ms_start = now(); -#endif - float h = time / (pi * 2) / 50.0f; - - screen.pen = Pen(0, 0, 0); - screen.clear(); - - float energy = float(player1.energy) / STARTING_ENERGY; - if(player1.invincible) { - uint8_t rgb = (sinf(time / 200.0f) * 70) + 100; - screen.pen = Pen(rgb, rgb, rgb); - } - else { - if(energy <= WARNING_ENERGY) { - uint8_t c = 128 + sin(time / 100) * 127; - screen.pen = Pen(255, c, c); - } else { - screen.pen = Pen(255, 255, 255); - } - } - std::vector player1_shape(player1.shape); - translate_polygon(player1_shape, player1.position); - rotate_polygon(player1_shape, player1.rotation, player1.position); - draw_polygon(player1_shape); - - for(auto &p: polygons){ - uint16_t area = std::min((uint16_t)5000u, p.area); - if(area <= ASTEROID_MIN_AREA * 2) { - screen.pen = hsv_to_rgba(h / (pi * 2) + p.colour_offset, 1.0, 1.0); - } else { - float scale = area / 10000.0f; - screen.pen = Pen(1.0f - scale, 0.0f, 1.0f); - } - draw_polygon(p.points); -#ifdef __DEBUG__ - screen.text(std::to_string(p.area), minimal_font, Point(p.origin), true, center_center); - screen.pen = Pen(255, 255, 255); - screen.text(std::to_string(p.points.size()), minimal_font, Point(p.origin) + Point(0, 12), true, center_center); - screen.pixel(p.origin); -#endif - } - - for(auto &p: particles){ - screen.pen = Pen(p.color, p.color, p.color, P_MAX_AGE - (uint8_t)p.age); - p.age += 2; - p.pos += p.vel; - screen.pixel(p.pos); - } - - particles.erase(std::remove_if(particles.begin(), particles.end(), [](SpaceDust particle) { return (particle.age >= P_MAX_AGE); }), particles.end()); - - - if(time - player1.t_shot_fired > 0 && time - player1.t_shot_fired < 500){ - int c = 255 - ((time - player1.t_shot_fired ) / 2); - screen.pen = Pen(c, c, c); - screen.line(player1.shot_origin, player1.shot_target); - } else if (player1.shot_charge > 0) { - screen.pen = Pen(0, 255, 0); - screen.line(player1.shot_origin, player1.shot_target); - } - -#ifdef __DEBUG__ - uint32_t ms_end = now(); - - // draw FPS meter - screen.alpha = 255; - screen.pen = Pen(255, 255, 255, 100); - screen.rectangle(Rect(1, screen.bounds.h - 10, 12, 9)); - screen.pen = Pen(255, 255, 255, 200); - std::string fms = std::to_string(ms_end - ms_start); - screen.text(fms, minimal_font, Rect(3, screen.bounds.h - 9, 10, 16)); - - int block_size = 4; - for (uint32_t i = 0; i < (ms_end - ms_start); i++) { - screen.pen = Pen(i * 5, 255 - (i * 5), 0); - screen.rectangle(Rect(i * (block_size + 1) + 1 + 13, screen.bounds.h - block_size - 1, block_size, block_size)); - } -#endif - - screen.pen = Pen(255, 255, 255); - screen.text(std::to_string(player1.score), custom_font, Point(5, 5)); - - - Vec2 lives = Vec2(screen.bounds.w - (STARTING_LIVES * 18) + 7, 11); - for(auto i = 0u; i < STARTING_LIVES; i++) { - std::vector life_shape(player1.shape); - rotate_polygon(life_shape, 0.0f, lives); - translate_polygon(life_shape, lives); - lives.x += 18; - screen.pen = i < player1.lives ? Pen(255, 255, 255) : Pen(64, 64, 64); - draw_polygon(life_shape); - } - - uint8_t alpha = 255; - if(energy <= WARNING_ENERGY) { - alpha = 128 + sin(time / 100) * 127; - } - Rect rect_energy = Rect(5, screen.bounds.h - 5, 0, 5); - rect_energy.y -= rect_energy.h; - rect_energy.w = (screen.bounds.w - 10) * energy; - - for(auto y = 0; y < rect_energy.h; y+=2) { - screen.pen = Pen(255, 255, 255); - screen.line(rect_energy.tl(), rect_energy.tr()); - screen.alpha = alpha; - screen.pen = Pen(1.0f - energy, energy, 0.0f); - screen.line(rect_energy.tl(), rect_energy.tr()); - screen.alpha = 255; - rect_energy.y += 2; - } -} - -void update(uint32_t time) { - - Vec2 movement(0, 0); - float rotation_speed = pi / 720.0f; - if(buttons & Button::B) { - rotation_speed /= 2.0f; - } - - if (pressed(Button::DPAD_LEFT)) { player1.rotational_velocity += rotation_speed; } - if (pressed(Button::DPAD_RIGHT)) { player1.rotational_velocity -= rotation_speed; } - //player1.rotational_velocity -= joystick.x * pi / 720; - - if(player1.energy >= MOVEMENT_COST) { - if (pressed(Button::DPAD_UP)) { movement.y -= 0.03f; } - if (pressed(Button::DPAD_DOWN)) { movement.y += 0.03f; } - //movement.y += joystick.y / 10.0f; - - if(pressed(Button::DPAD_UP) || pressed(Button::DPAD_DOWN)) { - player1.energy -= MOVEMENT_COST; - channels[0].trigger_attack(); - //thrust(player1.position, player1.velocity); - } else { - channels[0].trigger_release(); - } - } else { - channels[0].trigger_release(); - } - - // Player loses invincibility if they shoot - if(buttons.pressed & Button::A) { - player1.invincible = false; - } - - if (buttons & Button::A) { - if(player1.energy >= LASER_COST) { - player1.shot_charge++; - player1.energy -= LASER_COST; - } - - // Offet the shot to just in front of the players nose - Vec2 shot_offset(0.0f, -10.0f); - shot_offset.rotate(-player1.rotation); - player1.shot_origin = player1.position + shot_offset; - - // Create a line extruded out from the shot origin - Vec2 beam(0, 0); - beam -= Vec2(0, player1.shot_charge); - beam.rotate(-player1.rotation); - beam += player1.shot_origin; - player1.shot_target = Vec2(beam.x, beam.y); - } - - if (buttons.released & Button::A && time - player1.t_shot_fired > 50) { - player1.shot_fired = true; - player1.t_shot_fired = time; - - channels[1].frequency = 2000; - channels[1].trigger_attack(); - player1.shot_charge = 0; - } - - // Decay the shot and explosion frequency - if(channels[1].frequency > 0) { - channels[1].frequency *= 0.98f; - } - - if(channels[2].frequency > 0) { - channels[2].frequency *= 0.98f; - } - - movement.rotate(-player1.rotation); - player1.velocity += movement; - player1.velocity *= 0.99f; - player1.position += player1.velocity; - - player1.rotational_velocity *= 0.95f; - player1.rotation += player1.rotational_velocity; - - std::vector new_polygons; - - bool player_inside_asteroid = false; - - for(auto &p: polygons) { - bool do_split = false; - uint32_t player_collissions = 0; - Vec2 last_point = p.points.back(); - for(auto &point: p.points){ - Vec2 nope; - // Count the number of time a line projected out to the right of the player's origin - // collides with the line segment of this polygon - if(!player1.invincible && !player_inside_asteroid && line_segment_intersection(&nope, last_point, point, player1.position, player1.position + Vec2(1000.0f, player1.position.y))){ - player_collissions++; - } - - if(player1.shot_fired && !do_split){ - do_split = line_segment_intersection(&nope, last_point, point, player1.shot_origin, player1.shot_target); - } - - last_point = point; - } - // If the projected player line collides an *odd* number of times then we know the player is inside a polygon - if(player_collissions & 0b1) { - player_inside_asteroid = true; - } - - // If the player's shot intersects any line in this polygon we must slice it into two - if(do_split){ - // If the polygon is 2*ASTEROID_MIN_AREA then usually it'll result in - // two invalid polygons so we just count hitting it with *any* shot - // bump the player score, and remove it. - if(p.area <= ASTEROID_MIN_AREA * 2) { - player1.score += p.area; - p.prune = true; - } else { - Polygon poly = split_polygon(&p, player1.shot_origin, player1.shot_target); - if(poly.points.size()) { - new_polygons.push_back(poly); - } - } - } - } - player1.shot_fired = false; - - if(player_inside_asteroid) { - player1.energy -= DAMAGE_COST; - } - - for(auto &polygon: new_polygons){ - polygons.push_back(polygon); - } - - new_polygons.clear(); - polygons.erase(std::remove_if(polygons.begin(), polygons.end(), prune_polygons), polygons.end()); - - for(auto &polygon: polygons) { - polygon.rotational_velocity *= 0.9999f; - polygon.velocity *= 0.9999f; - rotate_polygon(polygon.points, polygon.rotational_velocity, polygon.origin); - translate_polygon(polygon, polygon.velocity); - - Vec2 offset(0, 0); - - for(auto &p : polygon.points) { - if(p.x > screen.bounds.w - 1) { - offset.x = std::min(offset.x, screen.bounds.w - p.x); - } else if (p.x < 0) { - offset.x = std::max(offset.x, std::abs(p.x)); - } - if(p.y > screen.bounds.h - 1) { - offset.y = std::min(offset.y, screen.bounds.h - p.y); - } else if (p.y < 0) { - offset.y = std::max(offset.y, std::abs(p.y)); - } - } - - if(offset.x){ - polygon.velocity.x *= -1; - } - if(offset.y){ - polygon.velocity.y *= -1; - } - - translate_polygon(polygon, offset); - } - - Vec2 offset(0, 0); - - std::vector player1_shape(player1.shape); - translate_polygon(player1_shape, player1.position); - rotate_polygon(player1_shape, player1.rotation, player1.position); - - for(auto &p: player1_shape) { - if(p.x > screen.bounds.w - 1) { - offset.x = std::min(offset.x, screen.bounds.w - p.x); - } else if (p.x < 0) { - offset.x = std::max(offset.x, std::abs(p.x)); - } - if(p.y > screen.bounds.h - 1) { - offset.y = std::min(offset.y, screen.bounds.h - p.y); - } else if (p.y < 0) { - offset.y = std::max(offset.y, std::abs(p.y)); - } - } - - if(offset.x){ - player1.velocity.x *= -1; - } - if(offset.y){ - player1.velocity.y *= -1; - } - - player1.position += offset; - - if(player1.energy < 0) { - explode(player1.position); - if(player1.lives > 0) { - player1.lives--; - } - if(player1.reset_or_die()) { - reset(); - } - } - - // Energy only regenerates if a shot isn't charging - if(player1.energy <= STARTING_ENERGY && player1.shot_charge == 0) { - player1.energy += REGEN_ENERGY; - } -} diff --git a/examples/geometry/geometry.hpp b/examples/geometry/geometry.hpp deleted file mode 100644 index 87fe6ba54..000000000 --- a/examples/geometry/geometry.hpp +++ /dev/null @@ -1,72 +0,0 @@ -#include "32blit.hpp" - -#define __AUDIO__ -//#define __DEBUG__ - - -const int16_t STARTING_ENERGY = 5000; -const int16_t REGEN_ENERGY = 10; -const int16_t LASER_COST = 12; -const int16_t MOVEMENT_COST = 10; -const int16_t DAMAGE_COST = 100; -const uint8_t STARTING_LIVES = 3; -const uint8_t P_MAX_AGE = 255; -const float WARNING_ENERGY = 0.4f; - -const uint8_t ASTEROID_COUNT = 5; -const uint8_t ASTEROID_MIN_R = 40; -const uint8_t ASTEROID_MAX_R = 50; - -const uint16_t ASTEROID_MIN_AREA = 100; - - -struct SpaceDust { - blit::Vec2 pos; - blit::Vec2 vel; - uint32_t age = 0; - uint8_t color = 0; - - SpaceDust(blit::Vec2 pos, blit::Vec2 vel, uint8_t color) : pos(pos), vel(vel), color(color) {}; -}; - -struct Player { - blit::Vec2 velocity; - blit::Vec2 position; - float rotation = 0; - float rotational_velocity = 0; - std::vector shape; - int32_t energy = 0; - unsigned int score = 0; - bool shot_fired = false; - unsigned int t_shot_fired = 0; - blit::Vec2 shot_origin; - blit::Vec2 shot_target; - int32_t shot_charge; - uint8_t lives = 3; - bool invincible = false; - - bool reset_or_die() { - bool reset = false; - energy = STARTING_ENERGY; - if(lives == 0) { - lives = STARTING_LIVES; - score = 0; - reset = true; - } - invincible = true; - position = blit::Vec2(blit::screen.bounds.w / 2, blit::screen.bounds.h / 2); - rotation = 0.0f; - rotational_velocity = 0.0f; - return reset; - } -}; - -struct Polygon { - float colour_offset; - blit::Vec2 velocity; - float rotational_velocity = 0; - blit::Vec2 origin; - std::vector points; - bool prune = false; - uint16_t area = 0; -}; \ No newline at end of file diff --git a/examples/geometry/geometry.png b/examples/geometry/geometry.png deleted file mode 100644 index 9c7dcc6f9..000000000 Binary files a/examples/geometry/geometry.png and /dev/null differ diff --git a/examples/geometry/metadata.yml b/examples/geometry/metadata.yml deleted file mode 100644 index f86c703ba..000000000 --- a/examples/geometry/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Geometry -description: Cleave through asteroids, slicing them into collectable chunks with your super powered mining laser -author: pimoroni -splash: - file: geometry.png -icon: - file: geometry-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: game \ No newline at end of file diff --git a/examples/geometry/numbers.png b/examples/geometry/numbers.png deleted file mode 100644 index 7401361d0..000000000 Binary files a/examples/geometry/numbers.png and /dev/null differ diff --git a/examples/jpeg/CMakeLists.txt b/examples/jpeg/CMakeLists.txt deleted file mode 100644 index f601cfd32..000000000 --- a/examples/jpeg/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (jpeg) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) - -if(32BLIT_PICO) - # No hardware JPEG decoding - return() -endif() - -blit_executable (jpeg jpeg.cpp) -blit_assets_yaml (jpeg assets.yml) -blit_metadata (jpeg metadata.yml) diff --git a/examples/jpeg/assets.yml b/examples/jpeg/assets.yml deleted file mode 100644 index 17aae37bf..000000000 --- a/examples/jpeg/assets.yml +++ /dev/null @@ -1,4 +0,0 @@ -assets.cpp: - test.jpeg: - name: asset_jpeg - type: raw/binary \ No newline at end of file diff --git a/examples/jpeg/jpeg.cpp b/examples/jpeg/jpeg.cpp deleted file mode 100644 index 7682daeef..000000000 --- a/examples/jpeg/jpeg.cpp +++ /dev/null @@ -1,31 +0,0 @@ - -#include - -#include "jpeg.hpp" -#include "graphics/jpeg.hpp" - -#include "assets.hpp" - -using namespace blit; - -/* setup */ -void init() { - set_screen_mode(ScreenMode::hires); - - // It's also possible to use decode_jpeg_file to load a file from the SD card - JPEGImage jpeg = decode_jpeg_buffer(asset_jpeg, asset_jpeg_length); - - //Surface jpeg_surface(jpeg.data, PixelFormat::RGB, jpeg.size); - //screen.blit(&jpeg_surface, Rect(Point(0), jpeg.size), Point(0)); - - // Display fullscreen jpeg - memcpy(screen.data, jpeg.data, jpeg.size.area() * 3); - - delete[] jpeg.data; -} - -void render(uint32_t time) { -} - -void update(uint32_t time) { -} \ No newline at end of file diff --git a/examples/jpeg/jpeg.hpp b/examples/jpeg/jpeg.hpp deleted file mode 100644 index b791bb454..000000000 --- a/examples/jpeg/jpeg.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include - -#include "32blit.hpp" - -void init(); -void update(uint32_t time); -void render(uint32_t time); \ No newline at end of file diff --git a/examples/jpeg/metadata.yml b/examples/jpeg/metadata.yml deleted file mode 100644 index a8502da1a..000000000 --- a/examples/jpeg/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: JPEG -description: A JPEG decoder demo. -author: daft_freak -splash: - file: ../no-image.png -icon: - file: ../no-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo diff --git a/examples/jpeg/test.jpeg b/examples/jpeg/test.jpeg deleted file mode 100644 index 2a5a99864..000000000 Binary files a/examples/jpeg/test.jpeg and /dev/null differ diff --git a/examples/logo/CMakeLists.txt b/examples/logo/CMakeLists.txt deleted file mode 100644 index dae3d4f25..000000000 --- a/examples/logo/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (logo) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (logo logo.cpp) -blit_metadata (logo metadata.yml) diff --git a/examples/logo/logo.cpp b/examples/logo/logo.cpp deleted file mode 100644 index ad2cd0a24..000000000 --- a/examples/logo/logo.cpp +++ /dev/null @@ -1,148 +0,0 @@ - -#include -#include -#include -#include - -#include "logo.hpp" - -using namespace blit; - -uint8_t logo[] = { - 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 2, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, - 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 2, - 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 1, 0, 2, 0, 1, 0, - 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, - 2, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, - 2, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, - 2, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1 -}; - -struct LogoParticle { - Vec3 direction; - Vec3 position; - Pen color; -}; - -// convert the logo points into vec3 -LogoParticle particles[63]; - -/* setup */ -void init() { - int i = 0; - for (int y = 0; y < 11; y++) { - for (int x = 0; x < 11; x++) { - int col = logo[x + y * 11]; - if (col != 0) { - particles[i].color = col == 1 ? Pen(255, 255, 255) : Pen(0, 255, 0); - particles[i].position = Vec3(x - 5.0f, y - 5.0f, 0.0f); - - float x = static_cast (rand()) / static_cast (RAND_MAX) - 0.5f; - float y = (static_cast (rand()) / static_cast (RAND_MAX) - 0.5f) / 4.0f; - float z = static_cast (rand()) / static_cast (RAND_MAX) - 0.5f; - - particles[i].direction = Vec3(x, y, z); - particles[i].direction.normalize(); - i++; - } - } - } -} - -float clamp(float v, float min, float max) { - return v < min ? min : (v > max) ? max : v; - -} - -void render(uint32_t time) { - static int32_t x = 0; x++; - static float ts = 0.0f; - static float dir = 0.02f; - - screen.pen = Pen(0, 0, 0, 50); - screen.clear(); - - time = time % 10000; - - ts += dir; - if (ts > 4.0f) { - dir *= -1; - ts = 1.0f; - } - - if (ts <= 0.0f) { - dir *= -1; - } - - float speed = 125.0f; - float td = (1.0f - std::min(1.0f, ts)); - - screen.alpha = 255; - - float scale = 7; - float half_scale = scale / 2.0f + 0.5f; - Mat4 r = Mat4::rotation(td * 250.0f, Vec3(0, 1, 0)); - Mat4 s = Mat4::scale(Vec3(scale, scale, scale)); - Mat4 t = Mat4::translation(Vec3(screen.bounds.w / 2, screen.bounds.h / 2, 0)); - - for (int i = 0; i < 63; i++) { - LogoParticle pc = particles[i]; - pc.position *= s; - pc.position += pc.direction * td * speed; - - - Vec3 tl = pc.position; - tl.x -= half_scale; - tl.y -= half_scale; - - Vec3 tr = pc.position; - tr.x += half_scale; - tr.y -= half_scale; - - Vec3 bl = pc.position; - bl.x -= half_scale; - bl.y += half_scale; - - Vec3 br = pc.position; - br.x += half_scale; - br.y += half_scale; - - float pcs = 50.0f; - tl *= r; - float tlp = 1.0f + clamp(tl.z / pcs, 0.0f, 1.0f); - tl *= tlp; - tl *= t; - - tr *= r; - float trp = 1.0f + clamp(tr.z / pcs, 0.0f, 1.0f); - tr *= trp; - tr *= t; - - bl *= r; - float blp = 1.0f + clamp(bl.z / pcs, 0.0f, 1.0f); - bl *= blp; - bl *= t; - - br *= r; - float brp = 1.0f + clamp(br.z / pcs, 0.0f, 1.0f); - br *= brp; - br *= t; - - screen.pen = pc.color; - - Point ptl(tl.x, tl.y); - Point ptr(tr.x, tr.y); - Point pbr(br.x, br.y); - Point pbl(bl.x, bl.y); - - screen.triangle(ptl, ptr, pbl); - screen.triangle(pbl, ptr, pbr); - } -} - -void update(uint32_t time) { -} diff --git a/examples/logo/logo.hpp b/examples/logo/logo.hpp deleted file mode 100644 index 76eec3741..000000000 --- a/examples/logo/logo.hpp +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#include - -#include "32blit.hpp" - -//extern surface fb; - -void init(); -void update(uint32_t time); -void render(uint32_t time); \ No newline at end of file diff --git a/examples/logo/metadata.yml b/examples/logo/metadata.yml deleted file mode 100644 index 3e5d80715..000000000 --- a/examples/logo/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Logo -description: Something something logo. -author: pimoroni -splash: - file: ../no-image.png -icon: - file: ../no-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo \ No newline at end of file diff --git a/examples/matrix-test/CMakeLists.txt b/examples/matrix-test/CMakeLists.txt deleted file mode 100644 index c7bf162ce..000000000 --- a/examples/matrix-test/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (matrix-test) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (matrix-test matrix-test.cpp) -blit_metadata (matrix-test metadata.yml) diff --git a/examples/matrix-test/matrix-test.cpp b/examples/matrix-test/matrix-test.cpp deleted file mode 100644 index f9ce191cc..000000000 --- a/examples/matrix-test/matrix-test.cpp +++ /dev/null @@ -1,109 +0,0 @@ -#include -#include -#include -#include - -#include "matrix-test.hpp" - -using namespace blit; - -/* setup */ -void init() { - /* - screen.alpha = 255; - screen.mask = nullptr; - screen.pen = rgba(39, 39, 54); - screen.clear();*/ -} - - -float angle = 0.0f; - -float deg2rad(float a) { - return a * (pi / 180.0f); -} - -void draw(std::array vecs, std::vector trs) { - auto s = uint8_t(150 / trs.size()); - Pen p(255, 255, 255, 32); - - auto o = Vec2(80, 60); - - screen.pen = p; - screen.line(vecs[0] + o, vecs[1] + o); - screen.line(vecs[1] + o, vecs[2] + o); - screen.line(vecs[2] + o, vecs[3] + o); - screen.line(vecs[3] + o, vecs[0] + o); - - - for (auto &tr : trs) { - p.a += s; - - for (auto &v : vecs) { - v *= tr; - } - - auto o = Vec2(80, 60); - - screen.pen = p; - screen.line(vecs[0] + o, vecs[1] + o); - screen.line(vecs[1] + o, vecs[2] + o); - screen.line(vecs[2] + o, vecs[3] + o); - screen.line(vecs[3] + o, vecs[0] + o); - } - - // then apply the translations in reverse and ensure we end up back at the start - for (auto it = trs.rbegin(); it != trs.rend(); ++it) { - Mat3 &tr = *it; - - tr.inverse(); - for (auto &v : vecs) { - v *= tr; - } - - screen.pen = Pen(255, 0, 0); - screen.line(vecs[0] + o, vecs[1] + o); - screen.line(vecs[1] + o, vecs[2] + o); - screen.line(vecs[2] + o, vecs[3] + o); - screen.line(vecs[3] + o, vecs[0] + o); - } -} - -void render(uint32_t time_ms) { - - screen.pen = Pen(20, 30, 40); - screen.clear(); - - std::array vecs = { - Vec2(-10, -10), - Vec2(10, -10), - Vec2(10, 10), - Vec2(-10, 10) - }; - - draw( - vecs, - { Mat3::translation(Vec2(20, 20)), - Mat3::scale(Vec2(2, 2)), - Mat3::rotation(angle), - Mat3::translation(Vec2(10, 10)) - } - ); - /* - draw( - vecs, - mat3::scale(vec2(2, 2)) * - mat3::translation(vec2(10, 10)) * - mat3::rotation(angle) - );*/ - - - -// screen.text("angle: " + std::to_string(int(angle)), minimal_font, rect(0, 0, 160, 10)); - - -} - -void update(uint32_t time) { - angle++; -} diff --git a/examples/matrix-test/matrix-test.hpp b/examples/matrix-test/matrix-test.hpp deleted file mode 100644 index b791bb454..000000000 --- a/examples/matrix-test/matrix-test.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include - -#include "32blit.hpp" - -void init(); -void update(uint32_t time); -void render(uint32_t time); \ No newline at end of file diff --git a/examples/matrix-test/metadata.yml b/examples/matrix-test/metadata.yml deleted file mode 100644 index 90b3db235..000000000 --- a/examples/matrix-test/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Matrix Test -description: Something something matrix. -author: pimoroni -splash: - file: ../no-image.png -icon: - file: ../no-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo \ No newline at end of file diff --git a/examples/metadata-test/CMakeLists.txt b/examples/metadata-test/CMakeLists.txt deleted file mode 100644 index f2a073098..000000000 --- a/examples/metadata-test/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (metadata-test) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (metadata-test metadata-test.cpp) -blit_metadata (metadata-test metadata.yml) diff --git a/examples/metadata-test/metadata-test.cpp b/examples/metadata-test/metadata-test.cpp deleted file mode 100644 index 1a0f7f2e9..000000000 --- a/examples/metadata-test/metadata-test.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#include "metadata-test.hpp" - -using namespace blit; - -GameMetadata metadata; -std::string description; - -void init() { - set_screen_mode(hires); - metadata = get_metadata(); - description = screen.wrap_text(metadata.description, 220, minimal_font); -} - -void update(uint32_t time) { - -} - -void render(uint32_t time) { - screen.pen = Pen(20, 30, 40); - screen.clear(); - - screen.alpha = 255; - screen.pen = Pen(255, 255, 255); - screen.rectangle(Rect(0, 0, 320, 14)); - screen.pen = Pen(0, 0, 0); - screen.text("Metadata Test", minimal_font, Point(5, 4)); - - screen.pen = Pen(80, 120, 160); - - screen.text("Title:", minimal_font, Point(5, 24)); - screen.text("Desc:", minimal_font, Point(5, 44)); - screen.text("Author:", minimal_font, Point(5, 104)); - screen.text("Version:", minimal_font, Point(5, 124)); - screen.text("URL:", minimal_font, Point(5, 144)); - screen.text("Category:", minimal_font, Point(5, 164)); - - screen.pen = Pen(255, 255, 255); - - screen.text(metadata.title, minimal_font, Point(80, 24)); - screen.text(description, minimal_font, Rect(80, 44, 220, 40)); - screen.text(metadata.author, minimal_font, Point(80, 104)); - screen.text(metadata.version, minimal_font, Point(80, 124)); - screen.text(metadata.url, minimal_font, Point(80, 144)); - screen.text(metadata.category, minimal_font, Point(80, 164)); - - screen.watermark(); -} \ No newline at end of file diff --git a/examples/metadata-test/metadata-test.hpp b/examples/metadata-test/metadata-test.hpp deleted file mode 100644 index b500d172c..000000000 --- a/examples/metadata-test/metadata-test.hpp +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -#include "32blit.hpp" -#include "engine/version.hpp" \ No newline at end of file diff --git a/examples/metadata-test/metadata.yml b/examples/metadata-test/metadata.yml deleted file mode 100644 index 313009a96..000000000 --- a/examples/metadata-test/metadata.yml +++ /dev/null @@ -1,16 +0,0 @@ -title: Metadata Test -description: - This is a long description. - Maybe too long. - How long is too long? - That's a question. - The answer is simple. - If the t -author: pimoroni -splash: - file: ../no-image.png -icon: - file: ../no-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo \ No newline at end of file diff --git a/examples/mp3/CMakeLists.txt b/examples/mp3/CMakeLists.txt deleted file mode 100644 index b214740c1..000000000 --- a/examples/mp3/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (mp3) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (mp3 mp3.cpp) -blit_assets_yaml (mp3 assets.yml) -blit_metadata (mp3 metadata.yml) diff --git a/examples/mp3/assets.yml b/examples/mp3/assets.yml deleted file mode 100644 index 477f423db..000000000 --- a/examples/mp3/assets.yml +++ /dev/null @@ -1,4 +0,0 @@ -assets.cpp: - example.mp3: - name: asset_mp3 - type: raw/binary diff --git a/examples/mp3/example.mp3 b/examples/mp3/example.mp3 deleted file mode 100644 index 3c6e95922..000000000 Binary files a/examples/mp3/example.mp3 and /dev/null differ diff --git a/examples/mp3/metadata.yml b/examples/mp3/metadata.yml deleted file mode 100644 index 2b9a3a169..000000000 --- a/examples/mp3/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: MP3 Test -description: A basic MP3 audio test. -author: daft_freak -splash: - file: ../no-image.png -icon: - file: ../no-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo diff --git a/examples/mp3/mp3.cpp b/examples/mp3/mp3.cpp deleted file mode 100644 index e41bfe5ac..000000000 --- a/examples/mp3/mp3.cpp +++ /dev/null @@ -1,73 +0,0 @@ - -#include - -#include "mp3.hpp" -#include "audio/mp3-stream.hpp" - -#include "assets.hpp" - -using namespace blit; - -MP3Stream stream; - -/* setup */ -void init() { - set_screen_mode(ScreenMode::hires); - - // Files should be encoded as 22050Hz mono, but stereo and/or 44100Hz also work. - // (The output is still 22050Hz/mono) - - // It's also possible to load directly from the SD card. - File::add_buffer_file("example.mp3", asset_mp3, asset_mp3_length); - - // Pass false for do_duration_calc if you don't need the duration. - // (it requires decoding the entire file, which takes a while if reading from the SD card) - stream.load("example.mp3", true); - - // Any channel can be used here, the others are free for other sounds. - stream.play(0); -} - -void render(uint32_t time) { - screen.pen = Pen(0, 0, 0); - screen.clear(); - - screen.alpha = 255; - screen.pen = Pen(255, 255, 255); - screen.rectangle(Rect(0, 0, 320, 14)); - screen.pen = Pen(0, 0, 0); - screen.text("MP3 Playback", minimal_font, Point(5, 4)); - - int play_time = (stream.get_current_sample() * 1000) / 22050; - - // current time / duration - screen.pen = Pen(255, 255, 255); - Rect text_rect(5, 30, screen.bounds.w - 10, 10); - screen.text(std::to_string(play_time / 1000), minimal_font, text_rect); - screen.text(std::to_string(stream.get_duration_ms() / 1000), minimal_font, text_rect, true, TextAlign::top_right); - - // progress - screen.pen = Pen(40, 40, 40); - screen.rectangle(Rect(5, 40, screen.bounds.w - 10, 10)); - - screen.pen = Pen(255, 255, 255); - float w = static_cast(screen.bounds.w - 10) / stream.get_duration_ms() * play_time; - screen.rectangle(Rect(5, 40, w, 10)); -} - -void update(uint32_t time) { - - // play/pause - if(buttons.released & Button::A) { - if(stream.get_playing()) - stream.pause(); - else - stream.play(0); - } - - // restart - if(buttons.released & Button::X) - stream.restart(); - - stream.update(); -} diff --git a/examples/mp3/mp3.hpp b/examples/mp3/mp3.hpp deleted file mode 100644 index b791bb454..000000000 --- a/examples/mp3/mp3.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include - -#include "32blit.hpp" - -void init(); -void update(uint32_t time); -void render(uint32_t time); \ No newline at end of file diff --git a/examples/multiplayer/CMakeLists.txt b/examples/multiplayer/CMakeLists.txt deleted file mode 100644 index cd81d8a15..000000000 --- a/examples/multiplayer/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required(VERSION 3.8) -project (multiplayer) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (multiplayer multiplayer.cpp) -blit_metadata (multiplayer metadata.yml) diff --git a/examples/multiplayer/metadata.yml b/examples/multiplayer/metadata.yml deleted file mode 100644 index 3599b48bf..000000000 --- a/examples/multiplayer/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Multiplayer -description: Demo of multiplayer send/receive -author: daft_freak -splash: - file: multiplayer.png -icon: - file: multiplayer-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo \ No newline at end of file diff --git a/examples/multiplayer/multiplayer-icon.png b/examples/multiplayer/multiplayer-icon.png deleted file mode 100644 index 5f792de02..000000000 Binary files a/examples/multiplayer/multiplayer-icon.png and /dev/null differ diff --git a/examples/multiplayer/multiplayer.cpp b/examples/multiplayer/multiplayer.cpp deleted file mode 100644 index d11700ddf..000000000 --- a/examples/multiplayer/multiplayer.cpp +++ /dev/null @@ -1,64 +0,0 @@ -#include -#include - -#include "multiplayer.hpp" - -#include "engine/multiplayer.hpp" - -using namespace blit; - -std::deque messages; -unsigned sent_count = 0; -unsigned recv_count = 0; -static constexpr int max_messages = 9; - -void on_message(const uint8_t *data, uint16_t len) { - if (messages.size() >= max_messages) { - messages.pop_front(); - } - messages.push_back(std::string((const char *)data, len)); - recv_count++; -} - -/* setup */ -void init() { - message_received = on_message; - enable_multiplayer(); -} - -void render(uint32_t time_ms) { - screen.pen = Pen(0, 0, 0); - screen.clear(); - - screen.alpha = 255; - screen.pen = Pen(255, 255, 255); - screen.rectangle(Rect(0, 0, 320, 14)); - screen.pen = Pen(0, 0, 0); - screen.text("Multiplayer Example", minimal_font, Point(5, 4)); - - screen.pen = Pen(64, 64, 64); - if(is_multiplayer_connected()) - screen.text("Press A to send message.", minimal_font, Point(screen.bounds.w / 2, 18), true, TextAlign::top_center); - else - screen.text("Not connected!", minimal_font, Point(screen.bounds.w / 2, 18), true, TextAlign::top_center); - - char counts[50]; - snprintf(counts, 50, "Sent: %u, Recv: %u", sent_count, recv_count); - screen.text(counts, minimal_font, Point(screen.bounds.w/2, screen.bounds.h-2), true, TextAlign::bottom_center); - - screen.pen = Pen(96, 96, 96); - int y = 28 + ((9-(int)messages.size()) * max_messages); - for(auto &msg : messages) { - screen.text(msg, minimal_font, Point(5, y)); - y += 9; - } -} - -void update(uint32_t time_ms) { - if ((buttons.pressed & Button::A) && is_multiplayer_connected()) { - char message[50]; - snprintf(message, 50, "This is message %u!", sent_count); - send_message((uint8_t *) message, (uint16_t)strlen(message)); - sent_count++; - } -} diff --git a/examples/multiplayer/multiplayer.hpp b/examples/multiplayer/multiplayer.hpp deleted file mode 100644 index 21d2d7a39..000000000 --- a/examples/multiplayer/multiplayer.hpp +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#include - -#include "32blit.hpp" - -void init(); -void update(uint32_t time); -void render(uint32_t time); - - diff --git a/examples/multiplayer/multiplayer.png b/examples/multiplayer/multiplayer.png deleted file mode 100644 index 2044385ae..000000000 Binary files a/examples/multiplayer/multiplayer.png and /dev/null differ diff --git a/examples/palette-cycle/CMakeLists.txt b/examples/palette-cycle/CMakeLists.txt deleted file mode 100644 index c10c7566e..000000000 --- a/examples/palette-cycle/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (palette-cycle) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (palette-cycle palette-cycle.cpp) -blit_assets_yaml (palette-cycle assets.yml) -blit_metadata (palette-cycle metadata.yml) \ No newline at end of file diff --git a/examples/palette-cycle/assets.yml b/examples/palette-cycle/assets.yml deleted file mode 100644 index 8d973af0e..000000000 --- a/examples/palette-cycle/assets.yml +++ /dev/null @@ -1,4 +0,0 @@ -assets.hpp: - assets/fire.png: - palette: assets/fire_palette.png - name: fire_data diff --git a/examples/palette-cycle/assets/fire.png b/examples/palette-cycle/assets/fire.png deleted file mode 100644 index 91d6a9ae4..000000000 Binary files a/examples/palette-cycle/assets/fire.png and /dev/null differ diff --git a/examples/palette-cycle/assets/fire_palette.png b/examples/palette-cycle/assets/fire_palette.png deleted file mode 100644 index 2e95ba206..000000000 Binary files a/examples/palette-cycle/assets/fire_palette.png and /dev/null differ diff --git a/examples/palette-cycle/metadata.yml b/examples/palette-cycle/metadata.yml deleted file mode 100644 index d7342f50b..000000000 --- a/examples/palette-cycle/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Palette Cycle -description: A burning torch animation using a static image with a cycling palette. -author: pimoroni -splash: - file: palette-cycle.png -icon: - file: palette-cycle-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo \ No newline at end of file diff --git a/examples/palette-cycle/palette-cycle-icon.png b/examples/palette-cycle/palette-cycle-icon.png deleted file mode 100644 index d8b08e6c9..000000000 Binary files a/examples/palette-cycle/palette-cycle-icon.png and /dev/null differ diff --git a/examples/palette-cycle/palette-cycle.cpp b/examples/palette-cycle/palette-cycle.cpp deleted file mode 100644 index 5afb4e171..000000000 --- a/examples/palette-cycle/palette-cycle.cpp +++ /dev/null @@ -1,100 +0,0 @@ -#include "palette-cycle.hpp" -#include "assets.hpp" - -using namespace blit; - -struct cycleg { - uint8_t offset; - float speed; - bool reverse; - Pen colours[12]; -}; - -cycleg cycle_gradients[3] = { - {16, 100, true, {}}, - {32, 200, true, {}}, - {48, 300, false, {}}, -}; - -Pen fadeColour(Pen a, Pen b, float f) { - Pen t(0, 0, 0, 255); - t.r = std::min(255, std::max(0, int(a.r + (float(b.r - a.r) * f)))); - t.g = std::min(255, std::max(0, int(a.g + (float(b.g - a.g) * f)))); - t.b = std::min(255, std::max(0, int(a.b + (float(b.b - a.b) * f)))); - return t; -} - -void init() { - set_screen_mode(ScreenMode::hires); - - screen.sprites = Surface::load(fire_data); - - for(int g = 0; g < 3; g++){ - for(int i = 0; i < 12; i++){ - Pen c = screen.sprites->palette[cycle_gradients[g].offset + i]; - cycle_gradients[g].colours[i] = c; - } - } -} - -void cycle(uint32_t time) { - for(int g = 0; g < 3; g++){ - int offset = cycle_gradients[g].offset; - float speed = cycle_gradients[g].speed; - float t = time / speed; - float phase = (t - floorf(t)); - for(int i = 0; i < 12; i++){ - int index = i + t; - index %= 12; - int blend_to = index + 1; - if (blend_to > 11) {blend_to = 0;} - if (blend_to < 0) {blend_to = 11;} - - int target = i; - if(cycle_gradients[g].reverse){ - target = 11 - target; - } - - screen.sprites->palette[offset + target] = fadeColour( - cycle_gradients[g].colours[index], - cycle_gradients[g].colours[blend_to], - std::max(0.0f, std::min(1.0f, phase))); - } - } -} - -void render(uint32_t time) { - cycle(time); - - screen.pen = screen.sprites->palette[0x59]; - screen.clear(); - - screen.alpha = 255; - screen.mask = nullptr; - screen.pen = Pen(255, 255, 255); - screen.rectangle(Rect(0, 0, 320, 14)); - screen.pen = Pen(0, 0, 0); - screen.text("Palette cycle demo", minimal_font, Point(5, 4)); - - int upscaled_size = 64 * 2; - screen.stretch_blit(screen.sprites, Rect(0, 0, 64, 64), Rect(4 + screen.bounds.w / 2, (screen.bounds.h - upscaled_size) / 2, upscaled_size, upscaled_size)); - - int swatch_size = 8; - for (int y = 0; y < 6; y++){ - for (int x = 0; x < 16; x++) { - int ox = 28 + (x * swatch_size); - int oy = (screen.bounds.h - upscaled_size) / 2 + (y * swatch_size); - int i = x + y * 16; - Pen col = screen.sprites->palette[i]; - screen.pen = col; - screen.rectangle(Rect( - ox, oy, swatch_size, swatch_size - )); - } - } - - screen.watermark(); -} - -void update(uint32_t time) { -} \ No newline at end of file diff --git a/examples/palette-cycle/palette-cycle.hpp b/examples/palette-cycle/palette-cycle.hpp deleted file mode 100644 index be914389b..000000000 --- a/examples/palette-cycle/palette-cycle.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "32blit.hpp" \ No newline at end of file diff --git a/examples/palette-cycle/palette-cycle.png b/examples/palette-cycle/palette-cycle.png deleted file mode 100644 index c5d963d22..000000000 Binary files a/examples/palette-cycle/palette-cycle.png and /dev/null differ diff --git a/examples/palette-swap/CMakeLists.txt b/examples/palette-swap/CMakeLists.txt deleted file mode 100644 index 1508fbb68..000000000 --- a/examples/palette-swap/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (palette-swap) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (palette-swap palette-swap.cpp) -blit_assets_yaml (palette-swap assets.yml) -blit_metadata (palette-swap metadata.yml) \ No newline at end of file diff --git a/examples/palette-swap/assets.yml b/examples/palette-swap/assets.yml deleted file mode 100644 index c17162523..000000000 --- a/examples/palette-swap/assets.yml +++ /dev/null @@ -1,4 +0,0 @@ -assets.hpp: - assets/boar_ship.png: - palette: assets/boar_ship_palette.png - name: boar_ship \ No newline at end of file diff --git a/examples/palette-swap/assets/boar_ship.png b/examples/palette-swap/assets/boar_ship.png deleted file mode 100644 index bcbef51c3..000000000 Binary files a/examples/palette-swap/assets/boar_ship.png and /dev/null differ diff --git a/examples/palette-swap/assets/boar_ship_palette.png b/examples/palette-swap/assets/boar_ship_palette.png deleted file mode 100644 index bd83684bd..000000000 Binary files a/examples/palette-swap/assets/boar_ship_palette.png and /dev/null differ diff --git a/examples/palette-swap/metadata.yml b/examples/palette-swap/metadata.yml deleted file mode 100644 index a37d3a4e4..000000000 --- a/examples/palette-swap/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Palette Swap -description: A basic demo of sprite recolour using palette swap. -author: pimoroni -splash: - file: ../no-image.png -icon: - file: ../no-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo \ No newline at end of file diff --git a/examples/palette-swap/palette-swap.cpp b/examples/palette-swap/palette-swap.cpp deleted file mode 100644 index bca0eada8..000000000 --- a/examples/palette-swap/palette-swap.cpp +++ /dev/null @@ -1,144 +0,0 @@ -#include "palette-swap.hpp" -#include "assets.hpp" - -#define NUM_PALETTES 4 -#define SWATCH_SIZE 29 - -using namespace blit; - -Pen alternate_palettes[NUM_PALETTES][5] = { - { - Pen(87, 37, 59), - Pen(148, 54, 61), - Pen(213, 112, 51), - Pen(242, 182, 61), - Pen(247, 206, 123) - }, - { - Pen(37, 38, 87), - Pen(85, 53, 148), - Pen(179, 51, 213), - Pen(242, 61, 226), - Pen(247, 123, 236) - }, - { - Pen(87, 87, 87), - Pen(148, 148, 148), - Pen(195, 198, 212), - Pen(225, 223, 240), - Pen(245, 245, 245) - }, - { - Pen(91, 21, 21), - Pen(134, 31, 31), - Pen(181, 21, 21), - Pen(233, 39, 39), - Pen(253, 76, 76) - } -}; - -Point position[NUM_PALETTES] = { - Point(30, 50), - Point(180, 140), - Point(50, 140), - Point(180, 40) -}; - -void init() { - set_screen_mode(ScreenMode::hires); - - screen.sprites = Surface::load(boar_ship); -} - -void all_ships_at_once_demo(uint32_t time) { - screen.pen = Pen(0x4e, 0xb3, 0xf7); - screen.clear(); - - screen.alpha = 255; - screen.pen = Pen(255, 255, 255); - screen.rectangle(Rect(0, 0, 320, 14)); - screen.pen = Pen(0, 0, 0); - screen.text("Palette swap demo", minimal_font, Point(5, 4)); - - for (int p = 0; p < NUM_PALETTES; p++){ - for (int x = 0; x < 5; x++){ - screen.sprites->palette[4 + x] = alternate_palettes[p][x]; - } - - Point pos = position[p]; - - pos.x += sinf(time / 5000.0f + p) * 20.0f; - pos.y += sinf(time / 500.0f + p) * 10.0f; - - screen.stretch_blit(screen.sprites, - Rect(0, 0, screen.sprites->bounds.w, screen.sprites->bounds.h), - Rect(pos.x, pos.y, screen.sprites->bounds.w * 2, screen.sprites->bounds.h * 2) - ); - } - - screen.watermark(); -} - -void single_ship_cycling_demo(uint32_t time) { - screen.pen = Pen(0x4e, 0xb3, 0xf7); - screen.clear(); - - screen.alpha = 255; - screen.pen = Pen(255, 255, 255); - screen.rectangle(Rect(0, 0, 320, 14)); - screen.pen = Pen(0, 0, 0); - screen.text("Palette swap demo", minimal_font, Point(5, 4)); - - int palette_index = int(time / 1000.0) % NUM_PALETTES; - - for (int x = 0; x < 5; x++){ - screen.sprites->palette[4 + x] = alternate_palettes[palette_index][x]; - } - - screen.stretch_blit(screen.sprites, - Rect(0, 0, screen.sprites->bounds.w, screen.sprites->bounds.h), - Rect( - (screen.bounds.w - screen.sprites->bounds.w * 4) / 2, - 5 + (screen.bounds.h - ((SWATCH_SIZE + 10) * 2) - screen.sprites->bounds.h * 4) / 2, - screen.sprites->bounds.w * 4, screen.sprites->bounds.h * 4 - ) - ); - - uint8_t top = screen.bounds.h - ((SWATCH_SIZE + 10) * 2); - - for (int p = 0; p < NUM_PALETTES; p++){ - - uint8_t palette_top = p > 1 ? top + SWATCH_SIZE + 10 : top; - uint8_t palette_left = ((p % 2) * 5 * SWATCH_SIZE) + (10 * (p % 2)) + 10; - - if (palette_index == p) { - screen.pen = Pen(0, 0, 0); - screen.rectangle(Rect( - palette_left - 4, - palette_top - 4, - SWATCH_SIZE * 5 + 8, - SWATCH_SIZE + 8 - )); - } - for (int c = 0; c < 5; c++) { - Pen colour = alternate_palettes[p][c]; - screen.pen = colour; - screen.rectangle(Rect( - palette_left + (c * SWATCH_SIZE), - palette_top, - SWATCH_SIZE, - SWATCH_SIZE - )); - } - } - - screen.watermark(); -} - -void render(uint32_t time) { - all_ships_at_once_demo(time); -} - -void update(uint32_t time) { - -} \ No newline at end of file diff --git a/examples/palette-swap/palette-swap.hpp b/examples/palette-swap/palette-swap.hpp deleted file mode 100644 index b4df8bd93..000000000 --- a/examples/palette-swap/palette-swap.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "32blit.hpp" diff --git a/examples/particle/CMakeLists.txt b/examples/particle/CMakeLists.txt deleted file mode 100644 index 8d5e4726b..000000000 --- a/examples/particle/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (particle) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (particle particle.cpp) -blit_metadata (particle metadata.yml) \ No newline at end of file diff --git a/examples/particle/metadata.yml b/examples/particle/metadata.yml deleted file mode 100644 index 56d569f2f..000000000 --- a/examples/particle/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Particle -description: A demo of particle effects. -author: pimoroni -splash: - file: ../no-image.png -icon: - file: ../no-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo \ No newline at end of file diff --git a/examples/particle/particle.cpp b/examples/particle/particle.cpp deleted file mode 100644 index 2f06ab1f2..000000000 --- a/examples/particle/particle.cpp +++ /dev/null @@ -1,281 +0,0 @@ -#include -#include -#include -#include - -#include "particle.hpp" - -using namespace blit; - - - -/* setup */ -void init() { - blit::set_screen_mode(ScreenMode::hires); -} - -struct test_particle { - Vec2 pos; - Vec2 vel; - int age; - bool generated = false; -}; - - -struct smoke_particle : Particle { - float age_boost; - - smoke_particle(Vec2 pos, Vec2 vel, float age_boost) : Particle(pos, vel), age_boost(age_boost) {}; -}; - -Particle* generate_smoke() { - return new smoke_particle( - Vec2((rand() % 20) - 10, (rand() % 20) - 10), - Vec2(((rand() % 40) - 20) / 2, (rand() % 20) - 60), - (rand() % 3000) / 3000.0f - ); -} - -ParticleGenerator smoke_generator(150, 4000, generate_smoke); - -void render_smoke() { - for (auto p : smoke_generator.particles) { - smoke_particle *sp = static_cast(p); - float age = sp->age + sp->age_boost; - int alpha = (255 - (age * 75.0f)) / 8.0f; - int radius = (age * 150.0f) / 16.0f; - screen.pen = Pen(255, 255, 255, alpha); - screen.circle(p->pos + Point(50, 240), radius); - } -} - - -void smoke_generate(test_particle &p) { - p.pos = Vec2((rand() % 20) - 10, (rand() % 20) - 10); - p.vel = Vec2(((rand() % 40) - 20) / 2, (rand() % 20) - 60); - p.age = rand() % 200; - p.generated = true; -}; - -void smoke(uint32_t time_ms) { - static test_particle s[150]; - static int generate_index = 0; - static uint32_t last_time_ms = time_ms; - - int elapsed_ms = time_ms - last_time_ms; - float td = (elapsed_ms) / 1000.0f; - - smoke_generate(s[generate_index++]); - if (generate_index >= 150) - generate_index = 0; - - float w = sinf(time_ms / 1000.0f) * 0.05f; - - for (auto &p : s) { - if (p.generated) { - p.pos += p.vel * td; - p.vel += Vec2(w, 0); - p.age++; - - int alpha = (255 - (p.age / 2)) / 8.0f; - int radius = (p.age) / 16.0f; - screen.pen = Pen(255, 255, 255, alpha); - screen.circle(p.pos + Point(50, 240), radius); - } - } - - - last_time_ms = time_ms; -}; - - -void spark_generate(test_particle &p) { - p.pos = Vec2((rand() % 10) - 5, -100); - p.vel = Vec2(((rand() % 40) - 20), (rand() % 80) - 70); - p.age = 0;// rand() % 255; - p.generated = true; -}; - -void spark(uint32_t time_ms) { - static test_particle s[500]; - static int generate_index = 0; - static uint32_t last_time_ms = time_ms; - - int elapsed_ms = time_ms - last_time_ms; - float td = (elapsed_ms) / 1000.0f; - - spark_generate(s[generate_index++]); - if (generate_index >= 500) - generate_index = 0; - - Vec2 gravity = Vec2(0, 9.8f * 2) * td; - - for (auto &p : s) { - if (p.generated) { - p.vel += gravity; - p.pos += p.vel * td; - if (p.pos.y > 0) - p.vel.y *= -0.7f; - p.age++; - - int a = p.age / 2; - int r = 255 - (p.age / 2); - int g = 255 - (a * 2); - g = g < 0 ? 0 : g; - int b = 255 - (a * 4); - b = b < 0 ? 0 : b; - - int bloom = (255 - a) / 64; - screen.pen = Pen(r, g, b, 16); - screen.circle(p.pos + Point(160, 240), bloom); - screen.pen = Pen(r, g, b, 16); - screen.circle(p.pos + Point(160, 240), bloom / 2); - - screen.pen = Pen(r, g, b); - screen.pixel(p.pos + Point(160, 240)); - - } - } - - last_time_ms = time_ms; -}; - - -void rain_generate(test_particle &p) { - p.pos = Vec2((rand() % 80) - 40, (rand() % 10) - 250); - p.vel = Vec2(0, 140); - p.age = 0;// rand() % 255; - p.generated = true; -}; - -Vec2 g = Vec2(0, 9.8 * 5); - -void rain(uint32_t time_ms) { - static test_particle s[200]; - static int generate_index = 0; - static uint32_t last_time_ms = time_ms; - - int elapsed_ms = time_ms - last_time_ms; - float td = (elapsed_ms) / 1000.0f; - - rain_generate(s[generate_index++]); - if (generate_index >= 200) - generate_index = 0; - - Vec2 gravity = g * td; - - for (auto &p : s) { - if (p.generated) { - p.vel += gravity; - p.pos += p.vel * td; - - int floor = -3; - if (p.pos.x > 20 && p.pos.x < 46) - floor = -33; - - if (p.pos.y >= floor) { - p.pos.y = floor; - float bounce = ((rand() % 10)) / 80.0f; - p.vel.y *= -bounce; - p.vel.x = ((rand() % 30) - 15); - } - p.age++; - - int a = p.age / 2; - int r = 150 - (a / 2); - int g = 150 - (a / 2); - int b = 255;// -(a * 4); - - if(p.vel.length() > 20) { - screen.pen = Pen(r, g, b, 100); - screen.pixel(p.pos + Point(270, 239)); - screen.pen = Pen(r, g, b, 160); - screen.pixel(p.pos + Point(270, 241)); - } - screen.pen = Pen(r, g, b, 180); - screen.pixel(p.pos + Point(270, 242)); - } - } - - last_time_ms = time_ms; -}; - - - -Particle* generate_basic_rain() { - return new Particle( - Vec2((std::rand() % 120) + 100, 0), - Vec2(0, 100) - ); -} - -ParticleGenerator basic_rain_generator(250, 4000, generate_basic_rain); - -void render_basic_rain() { - for (auto p : basic_rain_generator.particles) { - Particle *sp = static_cast(p); - if (sp->pos.y >= 239) { - sp->pos.y = 239; - } - screen.pen = Pen(128, 128, 255); - screen.pixel(sp->pos); - } -} - -void render(uint32_t time_ms) { - - screen.pen = Pen(0, 0, 0, 255); - screen.clear(); - - //render_smoke(); - - //uint32_t ms_start = now(); - spark(time_ms); - smoke(time_ms); - rain(time_ms); - //render_basic_rain(); - //uint32_t ms_end = now(); - - // draw grid - screen.alpha = 255; - screen.pen = Pen(255, 255, 255); - screen.rectangle(Rect(0, 0, 320, 14)); - screen.pen = Pen(0, 0, 0); - screen.text("Rain demo", minimal_font, Point(5, 4)); - - /* screen.pen = Pen(255, 255, 255); - screen.text("Smoke:", minimal_font, point(10, 20)); - screen.text("Sparks:", minimal_font, point(120, 20)); - screen.text("Rain:", minimal_font, point(220, 20)); */ - - // draw FPS meter - /*screen.alpha = 255; - screen.pen = Pen(0, 0, 0); - screen.rectangle(rect(1, 240 - 10, 12, 9)); - screen.pen = Pen(255, 255, 255, 200); - std::string fms = std::to_string(ms_end - ms_start); - screen.text(fms, minimal_font, rect(3, 240 - 9, 10, 16)); - - int block_size = 4; - for (int i = 0; i < (ms_end - ms_start); i++) { - screen.pen = Pen(i * 5, 255 - (i * 5), 0); - screen.rectangle(rect(i * (block_size + 1) + 1 + 13, screen.bounds.h - block_size - 1, block_size, block_size)); - }*/ - - screen.watermark(); -} - -void update(uint32_t time_ms) { -// smoke_generator.update(time_ms); - basic_rain_generator.update(time_ms); - - if (pressed(Button::DPAD_LEFT)) { - g.rotate(0.1f); - } - - if (blit::buttons.released & blit::Button::A) { - blit::set_screen_mode(blit::lores); - } else if (blit::buttons.released & blit::Button::B) { - blit::set_screen_mode(blit::hires); - } -} diff --git a/examples/particle/particle.hpp b/examples/particle/particle.hpp deleted file mode 100644 index de24ed3ac..000000000 --- a/examples/particle/particle.hpp +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -#include - -#include "32blit.hpp" -#include "engine/particle.hpp" - -void init(); -void update(uint32_t time); -void render(uint32_t time); \ No newline at end of file diff --git a/examples/piano/CMakeLists.txt b/examples/piano/CMakeLists.txt deleted file mode 100644 index 0d7a19f14..000000000 --- a/examples/piano/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required(VERSION 3.8) -project (piano) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (piano piano.cpp) -blit_metadata (piano metadata.yml) diff --git a/examples/piano/metadata.yml b/examples/piano/metadata.yml deleted file mode 100644 index 434cbec42..000000000 --- a/examples/piano/metadata.yml +++ /dev/null @@ -1,8 +0,0 @@ -title: Piano -description: A basic piano roll -author: pimoroni -splash: - file: ../no-image.png -icon: - file: ../no-icon.png -version: v1.0.0 diff --git a/examples/piano/piano.cpp b/examples/piano/piano.cpp deleted file mode 100644 index 53f02536a..000000000 --- a/examples/piano/piano.cpp +++ /dev/null @@ -1,245 +0,0 @@ -#include -#include -#include -#include - -#include "piano.hpp" - -using namespace blit; - -uint16_t music_tick = 0; -uint16_t beat = 0; - -constexpr int step_count = 30; -constexpr int channel_count = 1; - -int16_t notes[channel_count][step_count]; -int16_t note_y[41]; -int16_t selected_note = 0; -int16_t selected_channel = 0; -bool playing = false; - -int note_to_freq(int note) { - return powf(2.0f, (float(note) / 12.0f)) * 293.67f; -} - -/* setup */ -void init() { - set_screen_mode(hires); - - for(int channel = 0; channel < channel_count; channel++) { - for(int beat = 0; beat < step_count; beat++) { - notes[channel][beat] = 12; - } - } - - // configure voices - - // melody track - channels[0].waveforms = Waveform::TRIANGLE; - channels[0].attack_ms = 10; - channels[0].decay_ms = 350; - channels[0].sustain = 0; - channels[0].release_ms = 168; - - // rhythm track - channels[1].waveforms = Waveform::SINE; - channels[1].attack_ms = 5; - channels[1].decay_ms = 100; - channels[1].sustain = 0; - channels[1].release_ms = 0; - - // drum track - channels[2].waveforms = 0; // Waveform::NOISE; - channels[2].attack_ms = 10; - channels[2].decay_ms = 750; - channels[2].sustain = 0; - channels[2].release_ms = 100; - - // set global volume - // volume = 2048; - - screen.pen = Pen(0, 0, 0, 255); - screen.clear(); -} - -void render(uint32_t time_ms) { - screen.pen = Pen(20, 30, 40); - screen.clear(); - - for(int pass = 0; pass < 2; pass++) { - for(int note = 0; note < 41; note++) { - // White: 0, 2, 4, 5, 7, 9, 11 - // Black: 1, 3, 6, 8, 10 - int octave = floor(note / 12); - int y = 70 * octave; - int y_offset = 0; - int w = 20; - int h = 9; - switch(note % 12) { - case 11: - y += 10; - [[fallthrough]]; - case 9: - y += 10; - [[fallthrough]]; - case 7: - y += 10; - [[fallthrough]]; - case 5: - y += 10; - [[fallthrough]]; - case 4: - y += 10; - [[fallthrough]]; - case 2: - y += 10; - [[fallthrough]]; - case 0: - y_offset = 3; - if (pass == 1) continue; - screen.pen = Pen(255, 255, 255); - break; - case 3: - y += 10; - [[fallthrough]]; - case 1: - y += 4; - w = 15; - h = 7; - y_offset = 2; - if (pass == 0) continue; - screen.pen = Pen(0, 0, 0); - break; - case 10: - y += 10; - [[fallthrough]]; - case 8: - y += 10; - [[fallthrough]]; - case 6: - y += 34; - w = 15; - h = 7; - y_offset = 2; - if (pass == 0) continue; - screen.pen = Pen(0, 0, 0); - break; - } - y = screen.bounds.h - y - 10; - note_y[note] = y + y_offset; - screen.rectangle(Rect( - 0, y, - w, h - )); - screen.rectangle(Rect( - 20, y, - 300, h - )); - } - } - - for(int x = 0; x < 30; x++) { - screen.pen = x & 1 ? Pen(20, 30, 40, 220) : Pen(30, 40, 50, 220); - screen.rectangle(Rect( - 20 + x * 10, 0, - 10, 240 - )); - int note = notes[selected_channel][x] & ~0x100; - bool mute = notes[selected_channel][x] & 0x100; - if(note > -1){ - screen.pen = mute ? Pen(255, 255, 255, 100) : Pen(255, 255, 255, 255); - screen.rectangle(Rect( - 21 + x * 10, note_y[note], - 8, 3 - )); - } - } - - screen.pen = Pen(255, 200, 200); - screen.rectangle(Rect( - 20 + beat * 10, note_y[notes[selected_channel][beat] & ~0x100] - 1, - 10, 5 - )); - - screen.pen = Pen(255, 0, 0); - screen.rectangle(Rect( - 20 + selected_note * 10, note_y[notes[selected_channel][selected_note] & ~0x100] - 1, - 10, 5 - )); - - screen.watermark(); -} - -void play_selected_note() { - if(playing) return; - int16_t hz = note_to_freq(notes[selected_channel][selected_note] & ~0x100); - channels[selected_channel].frequency = hz; - channels[selected_channel].trigger_attack(); -} - -void play() { - if(!playing) return; - static uint16_t prev_beat = 1; - beat = (music_tick / 25) % step_count; // 200ms per beat - music_tick++; - - if (beat == prev_beat) return; - prev_beat = beat; - - for(uint8_t i = 0; i < channel_count; i++) { - if(notes[i][beat] & 0x100) { - channels[i].trigger_release(); - } else { - int16_t hz = note_to_freq(notes[i][beat] & ~0x100); - channels[i].frequency = hz; - channels[i].trigger_attack(); - } - } -} - -void update(uint32_t time_ms) { - play(); - - if(buttons.pressed & Button::DPAD_LEFT) { - if(selected_note > 0){ - selected_note--; - play_selected_note(); - } - } - if(buttons.pressed & Button::DPAD_RIGHT) { - if(selected_note < 30){ - selected_note++; - play_selected_note(); - } - } - if(buttons.pressed & Button::DPAD_UP) { - if(notes[selected_channel][selected_note] < 41) { - notes[selected_channel][selected_note]++; - play_selected_note(); - } - } - if(buttons.pressed & Button::DPAD_DOWN) { - if(notes[selected_channel][selected_note] > 0) { - notes[selected_channel][selected_note]--; - play_selected_note(); - } - } - if(buttons.pressed & Button::A) { - playing = !playing; - } - - if(buttons.pressed & Button::B) { - bool mute = notes[0][selected_note] & 0x100; - notes[0][selected_note] &= ~0x100; - if(!mute) { - notes[selected_channel][selected_note] |= 0x100; - } - } - - if(buttons.pressed & Button::Y) { - music_tick = 0; - beat = 0; - } -} - diff --git a/examples/piano/piano.hpp b/examples/piano/piano.hpp deleted file mode 100644 index 21d2d7a39..000000000 --- a/examples/piano/piano.hpp +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#include - -#include "32blit.hpp" - -void init(); -void update(uint32_t time); -void render(uint32_t time); - - diff --git a/examples/platformer/CMakeLists.txt b/examples/platformer/CMakeLists.txt deleted file mode 100644 index c320dba7f..000000000 --- a/examples/platformer/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (platformer) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (platformer platformer.cpp) -blit_assets_yaml (platformer assets.yml) -blit_metadata (platformer metadata.yml) - -# This removes support for set_screen_mode(hires) for Pico-based devices -# freeing up some extra RAM -target_compile_definitions(platformer PRIVATE ALLOW_HIRES=0) diff --git a/examples/platformer/assets.yml b/examples/platformer/assets.yml deleted file mode 100644 index c6cc95577..000000000 --- a/examples/platformer/assets.yml +++ /dev/null @@ -1,4 +0,0 @@ -assets.cpp: - ../../assets/s4m_ur4i-platformer.png: - name: packed_data - transparent: 0,0,0 \ No newline at end of file diff --git a/examples/platformer/metadata.yml b/examples/platformer/metadata.yml deleted file mode 100644 index f1dd411dd..000000000 --- a/examples/platformer/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Platformer -description: A platformer style game with lighting. -author: pimoroni -splash: - file: ../no-image.png -icon: - file: ../no-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: game \ No newline at end of file diff --git a/examples/platformer/platformer.cpp b/examples/platformer/platformer.cpp deleted file mode 100644 index ea1894364..000000000 --- a/examples/platformer/platformer.cpp +++ /dev/null @@ -1,822 +0,0 @@ - -#include -#include -#include -#include - -#include "platformer.hpp" - -using namespace blit; -using std::floor; - -constexpr Size screen_size(160, 120); - -/* define storage for the framebuffer, spritesheet, and mask */ -Pen __ss[128 * 128]; -uint8_t __m[screen_size.area()]; - -/* create surfaces */ -Surface m((uint8_t *)__m, PixelFormat::M, screen_size); - -const int max_light_radius = 60; -uint8_t __mshad[(max_light_radius * 2 + 1) * (max_light_radius * 2 + 1)]; -Surface mshad((uint8_t *)__mshad, PixelFormat::M, Size(max_light_radius * 2 + 1, max_light_radius * 2 + 1)); - -Point world_to_screen(const Vec2 &p); -Point world_to_screen(const Point &p); -Point screen_to_world(const Point &p); -void highlight_tile(Point p, Pen c); -Point tile(const Point &p); -Point player_origin(); -void draw_layer(MapLayer &layer); -void draw_flags(); -void render_light(Point pt, float radius, bool shadows); -void blur(uint8_t passes); -void bloom(uint8_t passes); -void load_assets(); - - -/* create map */ -enum TileFlags { SOLID = 1, WATER = 2, LADDER = 4 }; -Map map(Rect(0, 0, 48, 24)); - -uint8_t player_animation[5] = { 208, 209, 210, 211, 212 }; -float player_animation_frame = 0; - -float clamp(float v, float min, float max) { - return v > min ? (v < max ? v : max) : min; -} - -struct Player { - Vec2 vel; - Vec2 pos; - Size size; - bool flip = false; - - enum State { - STILL, - WALKING, - JUMPING, - SWIMMING, - CLIMBING - }; - - State state = STILL; - - std::map> animations; - float animation_frame = 0.0f; - - Player() { - animations[STILL] = { 208, 208, 208, 208, 208, 208, 209, 208, 208, 208, 208, 208, 208, 208 }; - animations[WALKING] = { 208, 209, 210, 211, 212 }; - animations[JUMPING] = { 217 }; - animations[SWIMMING] = { 217 }; - animations[CLIMBING] = { 217 }; - - vel = Vec2(0, 0); - pos = Vec2(100, 32); - size = Size(6, 14); - } - - Rect aabb() { - return Rect(pos.x, pos.y - size.h, size.w, size.h); - } - - Rect feet() { - return Rect(pos.x, pos.y - size.h / 2, size.w, size.h / 2); - } - - uint8_t animation_sprite_index(uint8_t animation) { - auto animation_length = animations[animation].size(); - return animations[animation][uint32_t(animation_frame) % animation_length]; - } - - Point current_tile() { - return Point((pos.x + (size.w / 2)) / 8, (pos.y - 8) / 8); - } - - bool tile_under_solid() { - Point p = current_tile(); - return map.has_flag(p, TileFlags::SOLID); - } - - bool tile_under_ladder() { - Point p = current_tile(); - return map.has_flag(p, TileFlags::LADDER); - } - - bool tile_under_water() { - Point p = current_tile(); - return map.has_flag(p, TileFlags::WATER); - } - - bool on_ground() { - return state == STILL || state == WALKING || state == SWIMMING || state == CLIMBING; - /*if (vel.y < 0) return false; - - Point p = current_tile(); - return map.has_flag(Point(p.x, p.y + 1), TileFlags::SOLID) && ((int32_t(pos.y) % 8) == 0);*/ - } - - bool in_water() { - return false; - Point p = current_tile(); - return map.has_flag(Point(p.x, p.y + 1), TileFlags::WATER); - } - - /* - return a clipped camera point that doesn't allow the viewport to - leave the world bounds - */ - Point camera() { - static Rect b(screen_size.w / 2, screen_size.h / 2, map.bounds.w * 8 - screen.bounds.w, map.bounds.h * 8 - screen.bounds.h); - return b.clamp(Point(floor(pos.x), floor(pos.y))); - } - - Rect viewport() { - Point c = camera(); - return Rect( - c.x - screen.bounds.w / 2, - c.y - screen.bounds.h / 2, - screen.bounds.w, - screen.bounds.h - ); - } - - void update() { - static float ground_acceleration_x = 0.5f; - static float air_acceleration_x = 0.2f; - static float ground_drag_x = 0.70f; - static float air_drag_x = 0.8f; - static float jump_velocity = 4.0f; - static Vec2 gravity(0, 0.98f / 10.0f); - - bool is_on_ground = on_ground(); - - vel.x *= is_on_ground ? ground_drag_x : air_drag_x; - if(!tile_under_ladder()) vel += gravity; - if(tile_under_water()) { - vel.y *= 0.80f; - } - else { - vel.y *= tile_under_ladder() ? 0.80f : 0.95f; - } - - - // Handle Left/Right collisions - pos.x += vel.x; - Rect bounds_lr = feet(); - - map.tiles_in_rect(bounds_lr, [this, bounds_lr](Point tile_pt) -> void { - if (map.has_flag(tile_pt, TileFlags::SOLID)) { - Rect rb(tile_pt.x * 8, tile_pt.y * 8, 8, 8); - uint32_t player_bottom = bounds_lr.y + bounds_lr.h; - uint32_t player_top = bounds_lr.y; - uint32_t player_left = bounds_lr.x; - uint32_t player_right = bounds_lr.x + bounds_lr.w; - uint32_t tile_bottom = rb.y + rb.h; - uint32_t tile_top = rb.y; - uint32_t tile_left = rb.x; - uint32_t tile_right = rb.x + rb.w; - if(((player_bottom > tile_top) && (player_bottom < tile_bottom)) - || ((player_top > tile_top) && player_top < tile_bottom)){ - // Collide the left-hand side of the tile right of player - if(player_right > tile_left && (player_left < tile_left)){ - pos.x = float(tile_left - bounds_lr.w); - vel.x = 0.0f; - } - // Collide the right-hand side of the tile left of player - if((player_left < tile_right) && (player_right > tile_right)) { - pos.x = float(tile_right); - vel.x = 0.0f; - } - } - } - }); - - // Handle Up/Down collisions - pos.y += vel.y; - Rect bounds_ud = feet(); - - map.tiles_in_rect(bounds_ud, [this, bounds_ud](Point tile_pt) -> void { - if (map.has_flag(tile_pt, TileFlags::SOLID)) { - Rect rb(tile_pt.x * 8, tile_pt.y * 8, 8, 8); - uint32_t player_bottom = bounds_ud.y + bounds_ud.h; - uint32_t player_top = bounds_ud.y; - uint32_t player_left = bounds_ud.x; - uint32_t player_right = bounds_ud.x + bounds_ud.w; - uint32_t tile_bottom = rb.y + rb.h; - uint32_t tile_top = rb.y; - uint32_t tile_left = rb.x; - uint32_t tile_right = rb.x + rb.w; - if((player_right > tile_left) && (player_left < tile_right)){ - // Collide bottom side of tile above player - if(player_top < tile_bottom && player_bottom > tile_bottom){ - pos.y = float(tile_bottom + bounds_ud.h); - vel.y = 0; - } - // Collide the top side of the tile below player - if((player_bottom > tile_top) && (player_top < tile_top)){ - pos.y = tile_top; - vel.y = 0; - state = STILL; - } - } - } - }); - - if (buttons.state & Button::DPAD_LEFT) { - vel.x -= is_on_ground ? ground_acceleration_x : air_acceleration_x; - flip = true; - if(is_on_ground) { - state = WALKING; - } - } - - if (buttons.state & Button::DPAD_RIGHT) { - vel.x += is_on_ground ? ground_acceleration_x : air_acceleration_x; - flip = false; - if(is_on_ground) { - state = WALKING; - } - } - - if (is_on_ground && buttons.pressed & Button::A) { - vel.y += -jump_velocity; - state = JUMPING; - } - - if(tile_under_ladder() || tile_under_water()) { - if (buttons.state & Button::DPAD_UP) { - vel.y -= 0.2f; - } - if (buttons.state & Button::DPAD_DOWN) { - vel.y += 0.2f; - } - state = tile_under_water() ? SWIMMING : CLIMBING; - } - - - } - - void render() { - uint8_t animation = Player::STILL; - - if (std::abs(vel.x) > 1) { - animation = Player::WALKING; - } - if (!on_ground()) { - animation = Player::JUMPING; - } - - uint8_t si = animation_sprite_index(animation); - - Point sp = world_to_screen(Point(pos.x, pos.y - 8)); - screen.sprite(si, sp, flip); - sp.y -= 8; - screen.sprite(si - 16, sp, flip); - - - /* - Rect bb = aabb(); - screen.pen = Pen(0, 255, 0); - screen.line(world_to_screen(bb.tl()), world_to_screen(bb.tr())); - screen.line(world_to_screen(bb.bl()), world_to_screen(bb.br())); - - // Collisions Debug - map.tiles_in_rect(bb, [&bb](Point tile_pt) -> void { - Point sp = world_to_screen(tile_pt * 8); - Rect rb(sp.x, sp.y, 8, 8); - - screen.pen = Pen(0, 255, 0, 150); - if (map.has_flag(tile_pt, TileFlags::SOLID)) { - screen.pen = Pen(255, 0, 0, 150); - } - - screen.rectangle(rb); - }); - */ - - //map.tiles_in_rect(bb) - } -} player; - - -struct bat { - Vec2 pos; - Vec2 vel = Vec2(-2, 0); - uint8_t current_frame = 0; - std::array frames = {{ 96, 97, 98, 99, 98, 97 }}; - - void update() { - current_frame++; - current_frame %= frames.size(); - - Vec2 test_pos = pos + (Vec2::normalize(vel) * 8.0f); - - if (map.has_flag(tile(Point(test_pos)), TileFlags::SOLID)) { - vel.x *= -1; - } - - pos += vel; - } -}; - -bat bat1; - -struct slime { - Vec2 pos; - Vec2 vel = Vec2(1, 0); - uint8_t current_frame = 0; - std::array frames = {{ 112, 113, 114, 113 }}; - - void update() { - current_frame++; - current_frame %= frames.size(); - - Vec2 test_pos = pos + (Vec2::normalize(vel) * 8.0f); - - if (map.has_flag(tile(Point(test_pos)), TileFlags::SOLID)) { - vel.x *= -1; - } - - pos += vel; - } -}; - -slime slime1; - -void animation_timer_callback(Timer &timer) { - bat1.update(); - slime1.update(); -} - -Timer t; - - - - - - -/* setup */ -void init() { - load_assets(); - - bat1.pos = Vec2(200, 22); - slime1.pos = Vec2(50, 112); - - t.init(animation_timer_callback, 50, -1); - t.start(); - - //engine::set_screen_mode(screen_mode::hires); -} - - -void render(uint32_t time) { - static int32_t x = 0; x++; - - uint32_t ms_start = now(); - - screen.mask = nullptr; - screen.alpha = 255; - screen.pen = Pen(0, 0, 0); - screen.clear(); - - // mask out for lighting - mshad.alpha = 255; - mshad.pen = Pen(0); - mshad.clear(); - - m.alpha = 255; - m.pen = Pen(64); - m.clear(); - - // render lights - - for (uint8_t y = 0; y < 24; y++) { - for (uint8_t x = 0; x < 48; x++) { - uint32_t ti = map.layers["effects"].tile_at(Point(x, y)); - Point lp = Point(x * 8 + 4, y * 8 + 3); - if (ti == 37 || ti == 38) { - render_light(lp, 15.0f, false); - } - } - } - - render_light(Point(player.pos.x, player.pos.y - 7), 60.0f, true); - - // light up the "outside" this should be done with map flags - Rect r; m.pen = Pen(255); - r = Rect(world_to_screen(Point(0, 0)), world_to_screen(Point(112, 40))); m.rectangle(r); - r = Rect(world_to_screen(Point(0, 40)), world_to_screen(Point(80, 48))); m.rectangle(r); - r = Rect(world_to_screen(Point(0, 48)), world_to_screen(Point(72, 56))); m.rectangle(r); - r = Rect(world_to_screen(Point(0, 56)), world_to_screen(Point(48, 64))); m.rectangle(r); - r = Rect(world_to_screen(Point(0, 64)), world_to_screen(Point(32, 72))); m.rectangle(r); - - bloom(3); - blur(1); - - - screen.alpha = 255; - screen.pen = Pen(39, 39, 54); - screen.clear(); - - - - // draw world - // layers: background, environment, effects, characters, objects - draw_layer(map.layers["background"]); - draw_layer(map.layers["environment"]); - draw_layer(map.layers["effects"]); - draw_layer(map.layers["objects"]); - - - // draw player - player.render(); - - - // bat - Point sp = world_to_screen(Point(bat1.pos.x - 4, bat1.pos.y)); - screen.sprite(bat1.frames[bat1.current_frame], sp, bat1.vel.x < 0 ? false : true); - - // slime - sp = world_to_screen(Point(slime1.pos.x - 4, slime1.pos.y)); - screen.sprite(slime1.frames[slime1.current_frame], sp, slime1.vel.x < 0 ? false : true); - - - // overlay water - screen.pen = Pen(56, 136, 205, 125); - for (uint8_t y = 0; y < 24; y++) { - for (uint8_t x = 0; x < 48; x++) { - Point pt = world_to_screen(Point(x * 8, y * 8)); - - if (map.has_flag(Point(x, y), TileFlags::WATER)) { - screen.rectangle(Rect(pt.x, pt.y, 8, 8)); - } - } - } - - // invert the lighting mask - m.custom_modify(m.clip, [](uint8_t *p, int16_t c) -> void { - while (c--) { - *p = 255 - *p; - p++; - } - }); - - // blend over lighting - screen.mask = &m; - screen.pen = Pen(39 / 2, 39 / 2, 54 / 2); - screen.clear(); - - static int tick = 0; - tick++; - screen.mask = nullptr; - screen.alpha = 255; - screen.sprite(139, Point(2, 2)); - screen.sprite(139, Point(12, 2)); - screen.sprite(139, Point(22, 2)); - - - // draw FPS meter - uint32_t ms_end = now(); - screen.mask = nullptr; - screen.pen = Pen(255, 0, 0); - for (uint32_t i = 0; i < (ms_end - ms_start); i++) { - screen.pen = Pen(i * 5, 255 - (i * 5), 0); - screen.rectangle(Rect(i * 3 + 1, 117, 2, 2)); - } - - - // highlight current player tile - // point pt2 = player.current_tile(); - // highlight_tile(pt2, rgba(0, 255, 0, 100)); - - // draw map flags - // draw_flags(); -} - - -/* - update() is called every 10ms, all effects should be - scaled to that duration - - player velocity is in tiles per second, so if the players - 'x' velocity is 1 then they move sideways by one tile per - second - - one tile is considered to be 1 metre -*/ -void update(uint32_t time) { - player.update(); - - /* - if (tick_seed % 3 == 0) { - for (uint8_t y = 0; y < 16; y++) { - for (uint8_t x = 0; x < 32; x++) { - uint8_t ti = tile_index(point(x, y)); - if (ti >= 5 && ti <= 7) { - set_tile_index(point(x, y), 5 + rand() % 3); - } - } - } - } - */ - -} - - - - -float orient2d(Vec2 p1, Vec2 p2, Vec2 p3) { - return (p2.x - p1.x) * (p3.y - p1.y) - (p2.y - p1.y) * (p3.x - p1.x); -} - -std::vector> get_occluders(Point pt, float radius) { - std::vector> occluders; - - Rect light_bounds(pt, pt); - light_bounds.inflate(max_light_radius); - - map.tiles_in_rect(light_bounds, [&occluders, &pt](Point tile_pt) -> void { - if (map.has_flag(tile_pt, TileFlags::SOLID)) { - Rect rb(tile_pt.x * 8, tile_pt.y * 8, 8, 8); - rb.x -= pt.x; - rb.y -= pt.y; - - Vec2 o(0, 0); - Vec2 fpt(pt.x, pt.y); - /*vec2 tl(rb.x - 0.5f, rb.y + 0.5f);// = rb.tl(); - vec2 tr(rb.x + rb.w - 0.5f, rb.y + 0.5f);// = rb.tr(); - vec2 bl(rb.x - 0.5f, rb.y + rb.h + 0.5f);// = rb.bl(); - vec2 br(rb.x + rb.w - 0.5f, rb.y + rb.h + 0.5f);// = rb.br(); - */ - Vec2 tl = Vec2(rb.tl().x - 1, rb.tl().y - 1); - Vec2 tr = Vec2(rb.tr().x - 1, rb.tr().y - 1); - Vec2 bl = Vec2(rb.bl().x - 1, rb.bl().y - 1); - Vec2 br = Vec2(rb.br().x - 1, rb.br().y - 1); - - if (!map.has_flag(Point(tile_pt.x, tile_pt.y + 1), TileFlags::SOLID) && orient2d(bl, br, o) > 0) { - occluders.push_back(std::make_pair(bl, br)); - } - - if (!map.has_flag(Point(tile_pt.x - 1, tile_pt.y), TileFlags::SOLID) && orient2d(tl, bl, o) > 0) { - occluders.push_back(std::make_pair(tl, bl)); - } - - if (!map.has_flag(Point(tile_pt.x, tile_pt.y - 1), TileFlags::SOLID) && orient2d(tr, tl, o) > 0) { - occluders.push_back(std::make_pair(tr, tl)); - } - - if (!map.has_flag(Point(tile_pt.x + 1, tile_pt.y), TileFlags::SOLID) && orient2d(br, tr, o) > 0) { - occluders.push_back(std::make_pair(br, tr)); - } - } - }); - - return occluders; -} - -void render_light(Point pt, float radius, bool shadows = false) { - Point lpt(max_light_radius, max_light_radius); - - mshad.alpha = 255; - mshad.pen = Pen(0); - mshad.clear(); - - // draw the light aura - mshad.alpha = (rand() % 10) + 40; - int steps = 20; - for (int j = steps; j > 0; j--) { - mshad.pen = Pen(255); - mshad.circle(lpt, (j * radius / steps)); - } - - if (shadows) - { - // cut out the shadows - mshad.alpha = 255; - mshad.pen = Pen(0); - - float rs = radius * radius; - std::vector> occluders = get_occluders(pt, radius); - for (auto occluder : occluders) { - Vec2 p1 = occluder.first; - Vec2 p2 = occluder.second; - Vec2 fpt(pt.x, pt.y); - - Vec2 rv1 = p1; - Vec2 rv2 = p2; - - if ((std::abs(rv1.x) * std::abs(rv1.y)) < rs && (std::abs(rv2.x) * std::abs(rv2.y)) < rs) { - // (max_light_radius * 2) = cludge to ensure shadows are projected far enough - // actually we should project shadows to the bounds of the light bounding box - // there is no need to "guess" but that requires working out the intersection - // with the edge of the bounding box and optionally inserting points at the corners - // if required. a task for another day.... - float c1 = (max_light_radius * 2) / float(std::max(std::abs(rv1.x), std::abs(rv1.y))); - float c2 = (max_light_radius * 2) / float(std::max(std::abs(rv2.x), std::abs(rv2.y))); - - Vec2 p3 = rv1 * c1; - Vec2 p4 = rv2 * c2; - - Point wp1 = p1 + lpt; - Point wp2 = p2 + lpt; - Point wp3 = p3 + lpt; - Point wp4 = p4 + lpt; - - std::vector poly = { - wp1, wp3, wp4, wp2 - }; - - mshad.triangle(wp1, wp2, wp3); - mshad.triangle(wp2, wp4, wp3); - //mshad.polygon(poly); - } - } - } - - Point light_corner = world_to_screen(pt - Point(max_light_radius, max_light_radius)); - m.custom_blend(&mshad, mshad.clip, light_corner, [](uint8_t *psrc, uint8_t *pdest, int16_t c) -> void { - while (c--) { - *pdest = *pdest ^ ((*pdest ^ *psrc) & -(*pdest < *psrc)); // integer `max` without branching - - pdest++; - psrc++; - } - }); -} - -void blur(uint8_t passes) { - uint8_t last; - - for (uint8_t pass = 0; pass < passes; pass++) { - uint8_t *p = (uint8_t *)m.data; - for (uint16_t y = 0; y < m.bounds.h; y++) { - last = *p; - p++; - - for (uint16_t x = 1; x < m.bounds.w - 1; x++) { - *p = (*(p + 1) + last + *p + *p) >> 2; - last = *p; - p++; - } - - p++; - } - } - - // vertical - for (uint8_t pass = 0; pass < passes; pass++) { - for (uint16_t x = 0; x < m.bounds.w; x++) { - uint8_t *p = (uint8_t *)m.data + x; - - last = *p; - p += m.bounds.w; - - for (uint16_t y = 1; y < m.bounds.h - 1; y++) { - *p = (*(p + m.bounds.w) + last + *p + *p) >> 2; - last = *p; - p += m.bounds.w; - } - } - } -} - - - void bloom(uint8_t passes) { - for (uint8_t pass = 0; pass < passes; pass++) { - uint8_t *p = (uint8_t *)m.data + m.bounds.w; - for (uint16_t y = 1; y < m.bounds.h - 1; y++) { - p++; - - for (uint16_t x = 1; x < m.bounds.w - 1; x++) { - uint8_t v1 = *p; - uint8_t v2 = *(p + 1); - uint8_t v3 = *(p + m.bounds.w); - *p++ = v1 > v2 ? (v1 > v3 ? v1 : v3) : (v2 > v3 ? v2 : v3); - } - - p++; - } - - p = (uint8_t *)m.data + (m.bounds.h * m.bounds.w) - 1 - m.bounds.w; - for (uint16_t y = 1; y < m.bounds.h - 1; y++) { - p--; - - for (uint16_t x = 1; x < m.bounds.w - 1; x++) { - uint8_t v1 = *p; - uint8_t v2 = *(p - 1); - uint8_t v3 = *(p - m.bounds.w); - *p-- = v1 > v2 ? (v1 > v3 ? v1 : v3) : (v2 > v3 ? v2 : v3); - } - - p--; - } - } -} - -void load_assets() { - std::vector layer_background = { 17,17,17,17,17,17,17,17,17,17,17,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,47,17,17,17,17,17,17,17,17,17,17,17,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,47,17,17,17,17,17,17,17,17,17,17,17,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,47,1,2,3,4,1,2,3,1,2,3,4,5,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,47,0,0,0,0,0,0,0,51,0,0,0,13,14,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,68,47,0,0,0,30,0,0,0,0,15,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,31,84,47,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,31,67,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,83,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,223,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,41,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,15,0,78,0,0,0,0,0,0,0,0,15,0,0,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,15,15,15,15,41,15,15,15,41,15,41,15,15,15,41,0,0,0,15,15,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,41,15,41,15,15,15,15,41,15,15,15,15,15,60,15,15,0,0,0,15,41,41,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,60,15,15,15,15,15,41,15,15,41,15,15,15,41,15,41,41,15,15,15,15,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,15,15,15,41,15,13,15,15,41,15,15,41,15,41,15,15,15,15,41,15,15,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,41,15,15,41,15,15,15,41,41,15,15,15,15,15,30,15,15,15,41,15,60,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,15,15,15,15,41,15,15,15,60,15,15,41,15,15,15,15,41,15,41,15,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };; - map.add_layer("background", layer_background); - - std::vector layer_environment = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,0,74,28,29,60,0,0,0,0,0,0,60,28,29,0,0,15,0,0,0,0,0,0,0,0,0,0,28,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,0,74,44,45,0,0,0,0,0,0,0,0,44,45,0,0,0,0,15,0,0,0,0,15,0,0,0,44,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,0,74,0,0,0,0,0,0,0,0,0,0,60,89,89,89,89,71,0,0,0,0,0,0,0,0,0,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,89,90,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,28,29,0,0,0,0,0,15,0,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,45,0,0,15,0,0,0,0,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,28,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,71,0,0,0,0,0,0,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,44,45,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,89,89,89,89,89,71,74,0,0,0,0,0,0,0,0,0,0,0,60,57,57,87,0,0,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,0,0,0,0,0,0,0,0,60,74,0,0,0,56,57,0,0,0,0,56,57,87,0,0,0,0,0,86,57,57,57,57,28,29,57,60,57,57,57,50,55,55,55,55,48,57,57,57,60,0,0,0,0,0,0,0,28,29,55,55,55,64,0,58,7,57,60,72,0,0,0,0,75,94,94,94,94,94,94,76,44,45,0,0,0,0,0,66,16,16,48,49,127,0,0,28,29,60,0,0,0,0,0,0,44,45,16,16,16,64,0,74,7,0,0,72,0,0,0,0,79,0,0,0,0,0,0,77,0,75,94,94,94,94,76,126,49,49,127,0,0,0,0,44,45,66,55,55,55,55,55,55,60,16,16,16,16,64,0,74,7,0,0,93,94,94,94,94,95,0,0,0,0,0,0,93,94,95,0,0,0,0,47,0,0,0,0,0,0,0,0,0,0,66,16,16,16,16,16,16,16,16,16,16,16,64,0,74,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,47,0,0,0,0,0,0,0,0,0,0,126,49,49,49,50,16,16,16,16,16,16,48,127,0,31,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66,16,16,16,16,16,48,127,0,0,31,7,0,0,0,0,0,0,0,0,40,61,62,62,63,0,0,0,0,0,0,0,0,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,49,49,49,49,49,127,0,0,0,91,62,62,62,62,62,62,62,62,62,62,92,0,0,91,62,62,63,0,61,62,62,62,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,79,0,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,79,59,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; - map.add_layer("environment", layer_environment); - map.layers["environment"].add_flags({ 8, 59, 31, 47, 28, 29, 44, 45, 60, 48, 49, 50, 64, 66, 80, 81, 82, 56, 57, 58, 72, 74, 88, 89, 90, 61, 62, 63, 77, 79, 93, 94, 95 }, TileFlags::SOLID); - map.layers["environment"].add_flags(7, TileFlags::LADDER); - map.layers["environment"].add_flags({ 16, 55, 223 }, TileFlags::WATER); - - std::vector layer_effects = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; - map.add_layer("effects", layer_effects); - - std::vector layer_characters = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,182,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; - map.add_layer("characters", layer_characters); - - std::vector layer_objects = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,39,0,0,0,0,0,0,0,0,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,0,0,0,0,0,0,0,0,0,0,85,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; - map.add_layer("objects", layer_objects); - - screen.sprites = Surface::load(packed_data); -} - - -Point world_to_screen(const Vec2 &p) { - return Point( - p.x - player.camera().x + m.bounds.w / 2, - p.y - player.camera().y + m.bounds.h / 2 - ); -} - -Point world_to_screen(const Point &p) { - return Point( - p.x - player.camera().x + m.bounds.w / 2, - p.y - player.camera().y + m.bounds.h / 2 - ); -} - -Point screen_to_world(const Point &p) { - return Point( - p.x + player.camera().x - m.bounds.w / 2, - p.y + player.camera().y - m.bounds.h / 2 - ); -} - - -void highlight_tile(Point p, Pen c) { - screen.pen = c; - p.x *= 8; - p.y *= 8; - p = world_to_screen(p); - screen.rectangle(Rect(p.x, p.y, 8, 8)); -} - -Point player_origin() { - return Point(player.pos.x, player.pos.y); -} - -Point tile(const Point &p) { - return Point(p.x / 8, p.y / 8); -} - - -void draw_layer(MapLayer &layer) { - Point tl = screen_to_world(Point(0, 0)); - Point br = screen_to_world(Point(screen.bounds.w, screen.bounds.h)); - - Point tlt = tile(tl); - Point brt = tile(br); - - for (uint8_t y = tlt.y; y <= brt.y; y++) { - for (uint8_t x = tlt.x; x <= brt.x; x++) { - Point pt = world_to_screen(Point(x * 8, y * 8)); - int32_t ti = layer.map->tile_index(Point(x, y)); - if (ti != -1) { - uint8_t si = layer.tiles[ti]; - if (si != 0) { - screen.sprite(si, pt); - } - } - } - } -} - -Pen flag_colours[] = { - Pen(255, 0, 0, 100), - Pen(0, 255, 0, 100), - Pen(0, 0, 255, 100) -}; - -void draw_flags() { - for (uint8_t y = 0; y < 24; y++) { - for (uint8_t x = 0; x < 48; x++) { - Point pt = world_to_screen(Point(x * 8, y * 8)); - uint8_t f = map.get_flags(Point(x, y)); - - for (uint8_t i = 0; i < 3; i++) { - if (f & (1 << i)) { - screen.pen = flag_colours[i]; - screen.rectangle(Rect(pt.x, pt.y, 8, 8)); - } - } - } - } -} diff --git a/examples/platformer/platformer.hpp b/examples/platformer/platformer.hpp deleted file mode 100644 index aad9072b6..000000000 --- a/examples/platformer/platformer.hpp +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#include - -#include "32blit.hpp" - -#include "assets.hpp" - -void init(); -void update(uint32_t time); -void render(uint32_t time); diff --git a/examples/profiler-test/CMakeLists.txt b/examples/profiler-test/CMakeLists.txt deleted file mode 100644 index 57da83db1..000000000 --- a/examples/profiler-test/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (profiler-test) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (profiler-test profiler-test.cpp) -blit_metadata (profiler-test metadata.yml) \ No newline at end of file diff --git a/examples/profiler-test/metadata.yml b/examples/profiler-test/metadata.yml deleted file mode 100644 index e68b0c221..000000000 --- a/examples/profiler-test/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Profiler Test -description: A test of the 32blit profiler API. -author: pimoroni -splash: - file: ../no-image.png -icon: - file: ../no-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo \ No newline at end of file diff --git a/examples/profiler-test/profiler-test.cpp b/examples/profiler-test/profiler-test.cpp deleted file mode 100644 index ea4bc0d9d..000000000 --- a/examples/profiler-test/profiler-test.cpp +++ /dev/null @@ -1,226 +0,0 @@ -// Example showing how to use the profiler -// -// Button Function -// ===================================================== -// A Enable/Disable Bar Graphs -// B Enable/Disable Text Values -// X Enable/Disable History Graph -// Y Switch graph time between global, set by maximum render time -// and individual times, set by each probles maximum time -// UP Reduce rows displayed on page -// DOWN Increase rows displayed on page -// LEFT Back Page -// RIGHT Next Page - - -#include "profiler-test.hpp" -#include "graphics/color.hpp" -#include "engine/profiler.hpp" -#include - -using namespace blit; - -#define SCREEN_WIDTH 320 -#define SCREEN_HEIGHT 240 - -Profiler g_profiler; // global uRunningAverageSize and uRunningAverageSpan could be set here. -ProfilerProbe *g_pRenderProbe; -ProfilerProbe *g_pClearProbe; -ProfilerProbe *g_pRectProbe; -ProfilerProbe *g_pCircleProbe; -ProfilerProbe *g_pUpdateProbe; - - -uint32_t g_uSize = 2; -uint32_t g_uSizeMax = SCREEN_HEIGHT-1; -uint32_t g_uSizeMin = 2; -int g_uSizeChange = 1; - -bool g_bGraphEnabled = true; -bool g_bLabelsEnabled = true; -bool g_bDisplayHistory = true; -bool g_bUseGlobalTime = true; - -uint8_t g_uRows = 5; -uint8_t g_uPage = 1; - - - -#define RANDX random()%SCREEN_WIDTH -#define RANDY random()%SCREEN_HEIGHT -#define RANDC (int)(random()%256) - -void SetupMetrics() -{ - g_profiler.setup_graph_element(Profiler::dmCur, g_bLabelsEnabled, g_bGraphEnabled, Pen(0,255,0)); - g_profiler.setup_graph_element(Profiler::dmAvg, g_bLabelsEnabled, g_bGraphEnabled, Pen(0,255,255)); - g_profiler.setup_graph_element(Profiler::dmMax, g_bLabelsEnabled, g_bGraphEnabled, Pen(255,0,0)); - g_profiler.setup_graph_element(Profiler::dmMin, g_bLabelsEnabled, g_bGraphEnabled, Pen(255,255,0)); -} - -void init() -{ - set_screen_mode(ScreenMode::hires); - - // set up profiler - g_profiler.set_display_size(SCREEN_WIDTH, SCREEN_HEIGHT); - g_profiler.set_rows(g_uRows); - g_profiler.set_alpha(200); - g_profiler.display_history(g_bDisplayHistory); - - // create probes - g_pRenderProbe = g_profiler.add_probe("Render", 300); // 300 frames of history - g_pClearProbe = g_profiler.add_probe("Clear", 50, 6); // Example of lower resolution, 50 samples with a span of 6 = 300 frames - g_pRectProbe = g_profiler.add_probe("Rectangle", 300); - g_pCircleProbe = g_profiler.add_probe("Circle", 300); - g_pUpdateProbe = g_profiler.add_probe("Update"); - - // enable metrics - SetupMetrics(); -} - - -void render(uint32_t time) -{ - static Point ptMiddle(SCREEN_WIDTH/2, SCREEN_HEIGHT/2); - - //static ProfilerProbe *pAwayRenderProbe = g_profiler.AddProbe("AwayFromRender"); - - - //pAwayRenderProbe->StoreElapsedUs(true); - - bool button_a = buttons.pressed & Button::A; - bool button_b = buttons.pressed & Button::B; - bool button_x = buttons.pressed & Button::X; - bool button_y = buttons.pressed & Button::Y; - bool button_up = buttons.pressed & Button::DPAD_UP; - bool button_down = buttons.pressed & Button::DPAD_DOWN; - bool button_left = buttons.pressed & Button::DPAD_LEFT; - bool button_right = buttons.pressed & Button::DPAD_RIGHT; - bool button_home = buttons.pressed & Button::HOME; - - if(button_up && (g_uRows>1)) - { - g_uRows --; - g_profiler.set_rows(g_uRows); - } - - if(button_down && (g_uRows<11)) - { - g_uRows ++; - g_profiler.set_rows(g_uRows); - } - - if(button_left && (g_uPage > 1)) - { - g_uPage--; - } - - if(button_right && (g_uPage < g_profiler.get_page_count())) - { - g_uPage++; - } - - if(button_a) - { - // Graphs - g_bGraphEnabled = !g_bGraphEnabled; - SetupMetrics(); - } - - - if(button_b) - { - // Graphs - g_bLabelsEnabled = !g_bLabelsEnabled; - SetupMetrics(); - } - - if(button_x) - { - // Graphs - g_bDisplayHistory = !g_bDisplayHistory; - g_profiler.display_history(g_bDisplayHistory); - } - - if(button_y) - { - // change Graphs from time set globally to time set locally - g_bUseGlobalTime = !g_bUseGlobalTime; - } - - if(button_home) - { - // Log to CDC current values - g_profiler.log_probes(); - } - - g_pRenderProbe->start(); - - // clear screen - g_pClearProbe->start(); - screen.pen = Pen(0, 0, 0, 255); - screen.clear(); - g_pClearProbe->store_elapsed_us(); - - // draw rect - g_pRectProbe->start(); - screen.pen = Pen(0,0,255,255); - Point ptTl = Point(ptMiddle.x-(g_uSize/2), ptMiddle.y-(g_uSize/2)); - Point ptBr = Point(ptMiddle.x+(g_uSize/2), ptMiddle.y+(g_uSize/2)); - screen.rectangle(Rect(ptTl, ptBr)); - g_pRectProbe->store_elapsed_us(); - - // draw circle - g_pCircleProbe->start(); - screen.pen = Pen(255,0,0,128); - screen.circle(ptMiddle, (g_uSizeMax-g_uSize)/2); - g_pCircleProbe->store_elapsed_us(); - - - g_pRenderProbe->store_elapsed_us(); - - if(g_bUseGlobalTime) - { - // set global graph time to maximum render time - g_profiler.set_graph_time(g_pRenderProbe->elapsed_metrics().uMaxElapsedUs); - } - else - { - // disable global graph time - g_profiler.set_graph_time(0); - - // set All probes graph time to their maximum logged value - g_pRenderProbe->set_graph_time_us_to_max();; - g_pClearProbe->set_graph_time_us_to_max();; - g_pRectProbe->set_graph_time_us_to_max();; - g_pCircleProbe->set_graph_time_us_to_max();; - g_pUpdateProbe->set_graph_time_us_to_max();; - } - - // display the overlay - g_profiler.display_probe_overlay(g_uPage); - -} - -void update(uint32_t time) -{ - // Scoped profiler probes automatically call Start() and at end of scope call StoreElapsedUs() - ScopedProfilerProbe scopedProbe(g_pUpdateProbe); - - g_uSize+=g_uSizeChange; - if(g_uSize >= g_uSizeMax) - { - g_uSize -= (g_uSize-g_uSizeMax); - g_uSizeChange = - g_uSizeChange; - } - else - { - if(g_uSize <= g_uSizeMin) - { - g_uSize += g_uSizeMin-g_uSize; - g_uSizeChange = - g_uSizeChange; - } - } - -} diff --git a/examples/profiler-test/profiler-test.hpp b/examples/profiler-test/profiler-test.hpp deleted file mode 100644 index b4df8bd93..000000000 --- a/examples/profiler-test/profiler-test.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "32blit.hpp" diff --git a/examples/raycaster/CMakeLists.txt b/examples/raycaster/CMakeLists.txt deleted file mode 100644 index 1460da342..000000000 --- a/examples/raycaster/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (raycaster) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (raycaster raycaster.cpp) -blit_assets_yaml(raycaster assets.yml) -blit_metadata (raycaster metadata.yml) -target_compile_definitions(raycaster PRIVATE ALLOW_HIRES=0) diff --git a/examples/raycaster/assets.yml b/examples/raycaster/assets.yml deleted file mode 100644 index bfd66ee07..000000000 --- a/examples/raycaster/assets.yml +++ /dev/null @@ -1,5 +0,0 @@ -assets.cpp: - ../../assets/gadgetoid_raycaster.png: - name: asset_raycaster - ../../assets/wasp_raycaster.png: - name: asset_wasp diff --git a/examples/raycaster/metadata.yml b/examples/raycaster/metadata.yml deleted file mode 100644 index 1e50578a0..000000000 --- a/examples/raycaster/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Ray Caster -description: Bug spray your way through abandoned ruins as the titular Ray Caster, international man of mistery. -author: pimoroni -splash: - file: raycaster.png -icon: - file: raycaster-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: game diff --git a/examples/raycaster/raycaster-icon.png b/examples/raycaster/raycaster-icon.png deleted file mode 100644 index 912913701..000000000 Binary files a/examples/raycaster/raycaster-icon.png and /dev/null differ diff --git a/examples/raycaster/raycaster.cpp b/examples/raycaster/raycaster.cpp deleted file mode 100644 index 5f2992619..000000000 --- a/examples/raycaster/raycaster.cpp +++ /dev/null @@ -1,955 +0,0 @@ -#include -#include -#include -#include -#include -#include "raycaster.hpp" -#include "assets.hpp" -#include "32blit.hpp" - -using namespace blit; - -float z_buffer[SCREEN_WIDTH]; -float lut_camera_displacement[SCREEN_WIDTH]; -Vec2 ray_cache[SCREEN_WIDTH]; - -std::vector map_sprites(NUM_SPRITES); -std::vector stars(NUM_STARS); - -/* Ambient Occlusion Mask */ -uint8_t __m[SCREEN_WIDTH * SCREEN_HEIGHT]; -Surface mask((uint8_t *)__m, PixelFormat::M, Size(SCREEN_WIDTH, SCREEN_HEIGHT)); - -Surface *sprites_wasp; -Surface *sprites_world; - -Player player1{ - Vec2(0,0), - Vec2(0,0), - 0.0f, - 4, - Vec2(0,0), - Vec2(0,0), - 0.0f, - false, - false -}; -Map map(Rect(0, 0, 16, 16)); -MapLayer *map_layer_walls; -MapLayer *map_layer_floor; - -// Sizes for various sprites -const Rect sprite_bounds[9] = { - Rect(0, 64, 28, 64), // 0 Full-grown tree - Rect(28, 74, 28, 54), // 1 Mature tree - Rect(56, 94, 28, 34), // 2 Tall shrub - Rect(56, 70, 28, 24), // 3 Short shrub - Rect(48, 65, 8, 8), // 4 Tall grass - Rect(38, 66, 9, 7), // 5 Mid grass - Rect(30, 68, 7, 5), // 6 Smol grass - Rect(0, 0, 64, 64), // 7 Angry Wasp -> sprites_wasp - Rect(96, 64, 64, 64) // 8 Spraypaint -> just a circle -}; - -// Alternate palette colours -const Pen cols_a[]{ - Pen(0x15, 0x98, 0x5d, 200), - Pen(0x35, 0xA8, 0x3d, 200), - Pen(0x45, 0x88, 0x2d, 200) -}; - -const Pen cols_b[]{ - Pen(0x00, 0x7f, 0x43, 200), - Pen(0x20, 0x6f, 0x33, 200), - Pen(0x30, 0x8f, 0x23, 200) -}; - -enum TileFlags { WALL = 1, NO_GRASS = 2 }; -enum TileFacing { NONE = 0, NORTH = 1, SOUTH = 2, EAST = 4, WEST = 8 }; - -std::vector map_data_walls = { - 0x01, 0x02, 0x03, 0x04, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, - 0x01, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -}; - -std::vector map_data_floor = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x01, 0x05, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, - 0x00, 0x05, 0x03, 0x04, 0x05, 0x01, 0x01, 0x05, 0x00, 0x01, 0x01, 0x01, 0x01, 0x05, 0x01, 0x00, - 0x00, 0x04, 0x01, 0x05, 0x01, 0x01, 0x05, 0x01, 0x00, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, - 0x00, 0x03, 0x01, 0x00, 0x04, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x05, 0x01, 0x00, 0x01, 0x02, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x05, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, - 0x00, 0x01, 0x01, 0x00, 0x05, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x04, 0x05, 0x01, 0x00, - 0x00, 0x05, 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x00, 0x05, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, - 0x00, 0x01, 0x05, 0x01, 0x04, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x05, 0x01, 0x00, 0x01, 0x00, - 0x00, 0x01, 0x03, 0x00, 0x03, 0x01, 0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, - 0x00, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x05, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x05, 0x01, 0x01, 0x01, 0x00, - 0x00, 0x01, 0x01, 0x00, 0x05, 0x01, 0x01, 0x01, 0x00, 0x05, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - - -void get_random_empty_tile_location(Point &pos) { - while (1) { - pos.x = blit::random() % MAP_WIDTH; - pos.y = blit::random() % MAP_HEIGHT; - if (map.has_flag(pos, TileFlags::NO_GRASS)) continue; - return; - } -} - -void reset() { - player1.direction.y = -1; - player1.position.x = 3.5; - player1.position.y = 3.5; - player1.rotation = 0.0f; - player1.health = 4.0f; - - Point tile; - Vec2 offset; - - for (int s = 0; s < NUM_SPRITES - MAX_ENEMIES - MAX_SPRAY; s++) { - int texture = blit::random() % 100; - // Bit of a hack to generate fewer trees and shrubs - if (texture <= 3) { - map_sprites[s].texture = (SpriteTexture)texture; - } - else { - map_sprites[s].texture = (SpriteTexture)(4 + (texture % 3)); - } - get_random_empty_tile_location(tile); - offset.x = (float)blit::random() / 4294967295.0f; - offset.y = (float)blit::random() / 4294967295.0f; - map_sprites[s].position = Vec2(tile) + offset; - map_sprites[s].color = blit::random() % 3; - map_sprites[s].velocity.x = 0; - map_sprites[s].velocity.y = 0; - map_sprites[s].size = 1; - map_sprites[s].type = PLANT; - map_sprites[s].active = true; - } - - for (int s = NUM_SPRITES - MAX_ENEMIES - MAX_SPRAY; s < NUM_SPRITES - MAX_SPRAY; s++) { - map_sprites[s].texture = ANGRY_WASP; - get_random_empty_tile_location(tile); - map_sprites[s].position = Vec2(tile) + Vec2(0.5f, 0.5f); - map_sprites[s].color = blit::random() % 3; - map_sprites[s].velocity.x = 0; - map_sprites[s].velocity.y = 0; - map_sprites[s].size = map_sprites[s].color & 0b1; - map_sprites[s].type = WASP; - map_sprites[s].health = 4.0f; - map_sprites[s].rotation = (blit::random() % 360) / 360.0f * 2.0f * pi; - map_sprites[s].active = true; - } - - for (int s = NUM_SPRITES - MAX_SPRAY; s < NUM_SPRITES; s++) { - map_sprites[s].type = SPRAY; - map_sprites[s].health = 0.0f; - map_sprites[s].active = false; - map_sprites[s].color = 0; - } -} - - -void init() { - set_screen_mode(ScreenMode::lores); - - sprites_world = Surface::load(asset_raycaster); - sprites_wasp = Surface::load(asset_wasp); - screen.sprites = sprites_world; - - // Paint a circle into the spritesheet for bug spray - sprites_world->pen = Pen(16); - sprites_world->circle(sprite_bounds[8].center(), sprite_bounds[8].w / 2); - - map.add_layer("walls", map_data_walls); - map_layer_walls = &map.layers["walls"]; - map_layer_walls->add_flags({ 1, 2, 3, 4, 5 }, TileFlags::WALL); - map_layer_walls->add_flags({ 1, 2, 3, 4, 5 }, TileFlags::NO_GRASS); // Don't draw grass on walls - - map.add_layer("floor", map_data_floor); - map_layer_floor = &map.layers["floor"]; - map_layer_floor->add_flags({ 3, 4, 5 }, TileFlags::NO_GRASS); // Don't draw grass on flagstones - - - for (int x = 0; x < SCREEN_WIDTH; x++) { - lut_camera_displacement[x] = (float)(2 * x) / (float)(SCREEN_WIDTH) - 1.0f; - } - - for (int s = 0; s < NUM_STARS; s++) { - stars[s].position.x = blit::random() % 360; - stars[s].position.y = blit::random() % (HORIZON / 2); - stars[s].brightness = 32 + (blit::random() % 128); - } - - reset(); -} - - -Vec2 update_position(Entity *entity, Vec2 movement) { - Vec2 size(0.3f, 0.3f); - Vec2 result(0, 0); - int check_tile = 0; - - if (movement.x < 0) { - int bound = (int)std::floor(entity->position.x + movement.x - size.x); - - check_tile = check_tile | map.get_flags(Point(bound, (int32_t)std::floor(entity->position.y))); - if (movement.y > 0) { - check_tile = check_tile | map.get_flags(Point(bound, (int32_t)std::floor(entity->position.y - size.y))); - } - else if (movement.y < 0) { - check_tile = check_tile | map.get_flags(Point(bound, (int32_t)std::floor(entity->position.y + size.y))); - } - } - else if (movement.x > 0) { - int bound = (int)std::floor(entity->position.x + movement.x + size.x); - - check_tile = check_tile | map.get_flags(Point(bound, (int32_t)std::floor(entity->position.y))); - if (movement.y > 0) { - check_tile = check_tile | map.get_flags(Point(bound, (int32_t)std::floor(entity->position.y - size.y))); - } - else if (movement.y < 0) { - check_tile = check_tile | map.get_flags(Point(bound, (int32_t)std::floor(entity->position.y + size.y))); - } - } - - if ((check_tile & TileFlags::WALL) == 0) { - entity->position.x += movement.x; - result.x = movement.x; - } - - check_tile = 0; - - if (movement.y < 0) { - int bound = (int)std::floor(entity->position.y + movement.y - size.y); - - check_tile = check_tile | map.get_flags(Point((int32_t)std::floor(entity->position.x), bound)); - if (movement.x > 0) { - check_tile = check_tile | map.get_flags(Point((int32_t)std::floor(entity->position.x - size.x), bound)); - } - else if (movement.x < 0) { - check_tile = check_tile | map.get_flags(Point((int32_t)std::floor(entity->position.x + size.x), bound)); - } - } - else if (movement.y > 0) { - int bound = (int)std::floor(entity->position.y + movement.y + size.y); - - check_tile = check_tile | map.get_flags(Point((int32_t)std::floor(entity->position.x), bound)); - if (movement.x > 0) { - check_tile = check_tile | map.get_flags(Point((int32_t)std::floor(entity->position.x - size.x), bound)); - } - else if (movement.x < 0) { - check_tile = check_tile | map.get_flags(Point((int32_t)std::floor(entity->position.x + size.x), bound)); - } - } - - if ((check_tile & TileFlags::WALL) == 0) { - entity->position.y += movement.y; - result.y = movement.y; - } - - return result; -} - - -void update(uint32_t time) { - static uint32_t last_spray = 0; - static Vec2 rmove(0, 0); - Vec2 move(0, 0); - - if(player1.health <= 0) { - if(buttons.pressed & Button::A) { - reset(); - } - return; - } - - if (pressed(Button::DPAD_UP)) { - move.x = 0.02f; - } - else if (pressed(Button::DPAD_DOWN)) { - move.x = -0.02f; - } - else if (joystick.y < -0.1f || joystick.y > 0.1f) { - move.x = -joystick.y * 0.02f; - } - - rmove.x = move.x * player1.direction.x - move.y * player1.direction.y; - rmove.y = move.x * player1.direction.y + move.y * player1.direction.x; - - player1.velocity = update_position(&player1, rmove); - - if (pressed(Button::DPAD_LEFT)) { - player1.facing = false; - player1.rotation += -0.02f; - } - else if (pressed(Button::DPAD_RIGHT)) { - player1.facing = true; - player1.rotation += 0.02f; - } - else if (joystick.x < -0.1f || joystick.x > 0.1f) { - player1.rotation += joystick.x * 0.02f; - player1.facing = joystick.x > 0; - } - - player1.direction = Vec2(0, -1); - player1.direction.rotate(player1.rotation); - player1.direction.normalize(); - - if (pressed(Button::A)) { - player1.spraying = 1; - - if(time - last_spray > 50) { - Vec2 spray_offset(0.1f, 0.0f); - spray_offset.rotate(player1.rotation); - for(auto &sprite : map_sprites) { - if(sprite.type == SPRAY && !sprite.active) { - sprite.position = player1.position + (player1.direction * 0.1f) + spray_offset; - sprite.texture = BUGSPRAY; - sprite.velocity = (player1.direction * 0.01f) + player1.velocity; - sprite.health = MAX_SPRAY_HEALTH; - sprite.active = true; - last_spray = time; - break; - } - } - } - } - else - { - player1.spraying = 0; - } - - for(Sprite &sprite : map_sprites) { - if(!sprite.active) continue; - if(sprite.type == SPRAY) { - sprite.health -= 1.0f; - if(sprite.health < 0.0f) { - sprite.health = 0.0f; - sprite.active = false; - } else { - update_position(&sprite, sprite.velocity); - } - } - else if(sprite.type == WASP) { - Vec2 move = player1.position - sprite.position; - float angle = sprite.position.angle_to(player1.position); - float distance = move.length(); - if(distance < 0.3f) { - player1.health -= 0.01f; - } - angle = (2 * pi) - angle; - if(angle > sprite.rotation) { - sprite.rotation += 0.005f; - } - if(angle < sprite.rotation) { - sprite.rotation -= 0.005f; - } - while(sprite.rotation < 0.0f) { - sprite.rotation += 2 * pi; - } - while(sprite.rotation > 2 * pi) { - sprite.rotation -= 2 * pi; - } - move.normalize(); - move *= 0.003f; - for(Sprite &sprite_b : map_sprites) { - if(!sprite_b.active) continue; - if(sprite_b.type == WASP && sprite.position != sprite_b.position) { - Vec2 distance = sprite.position - sprite_b.position; - if(abs(distance.length()) < 1.0f) { - distance.normalize(); - move += distance * 0.003f; - } - } else if (sprite_b.type == SPRAY) { - Vec2 distance = sprite.position - sprite_b.position; - if(abs(distance.length()) < 1.0f) { - sprite.health -= 0.01f; - if(sprite.health < 0.0f) { - sprite.health = 0.0f; - sprite.active = false; - } - } - } - } - update_position(&sprite, move); - } - } -} - -uint32_t lfsr = 1; -uint16_t tap = 0x74b8; -void fizzlefade(uint8_t iterations=1) { - for(auto i = 0u; i < iterations; i++) { - uint16_t x = lfsr & 0x00ff; - uint16_t y = (lfsr & 0x7f00) >> 8; - - uint8_t lsb = lfsr & 1; - lfsr >>= 1; - - if (lsb) { - lfsr ^= tap; - } - - Point ff = Point(x - 1, y); - if(screen.bounds.contains(ff)) { - screen.pixel(Point(x - 1, y)); - } - } -} - -void render(uint32_t time) { -#ifdef SHOW_FPS - uint32_t ms_start = now(); -#endif - - if(player1.health <= 0) { - screen.alpha = 255; - screen.pen = Pen(255, 0, 0); - fizzlefade(50); - - screen.pen = Pen(255, 255, 255); - screen.text("You Died!", minimal_font, Rect(Point(0, 0), screen.bounds), true, center_center); - return; - } - - // update the orientation of the player camera plane - player1.camera = Vec2(-player1.direction.y, player1.direction.x); - player1.inverse_det = 1.0f / (player1.camera.x * player1.direction.y - player1.direction.x * player1.camera.y); - - // the current ray direction is the player direction, plus the camera direction multiplied by the displacement - for(auto column = 0u; column < SCREEN_WIDTH; column++) { - ray_cache[column].x = player1.direction.x + player1.camera.x * lut_camera_displacement[column]; - ray_cache[column].y = player1.direction.y + player1.camera.y * lut_camera_displacement[column]; - } - - // clear the mask -#ifdef AMBIENT_OCCLUSION - mask.alpha = 255; - mask.pen = Pen(0); - mask.clear(); -#endif - - // clear the canvas - screen.alpha = 255; - screen.pen = Pen(22, 21, 31); - screen.clear(); - - render_sky(); - - render_stars(); - - screen.clip = Rect(0, 0, SCREEN_WIDTH, OFFSET_TOP + VIEW_HEIGHT); - render_world(time); - -#ifdef AMBIENT_OCCLUSION - blur(1); - - screen.pen = Pen(10, 36, 24); - screen.mask = &mask; - screen.clear(); - screen.mask = nullptr; -#endif - - render_sprites(time); - //render_spray(time); - screen.clip = Rect(Point(0, 0), screen.bounds); - - // draw bug spray - int offset = OFFSET_TOP + int(sinf((player1.position.x + player1.position.y) * 4) * 3); // bob - screen.sprite(player1.spraying ? Rect(8, 16, 3, 4) : Rect(5, 16, 3, 4), Point(SCREEN_WIDTH - 48, VIEW_HEIGHT - 30 + offset)); - - // draw the HUD - screen.pen = Pen(37, 36, 46); - screen.rectangle(Rect(0, SCREEN_HEIGHT - 24, SCREEN_WIDTH, 24)); - for (int x = 0; x < SCREEN_WIDTH / 8; x++) { - screen.sprite(340, Point(x * 8, SCREEN_HEIGHT - 24)); - } - - // draw the health bar - for (int x = 0; x < 4; x++) { - screen.sprite(x >= player1.health ? 322 : 321, Point(32 + x * 10, SCREEN_HEIGHT - 16)); - } - - // draw DOOM guy (phil) - screen.sprite(Rect(11, 16, 3, 4), Point(0, SCREEN_HEIGHT - 32), player1.facing ? SpriteTransform::HORIZONTAL : 0); - - -#ifdef SHOW_FPS - uint32_t ms_end = now(); - - // draw FPS meter - screen.mask = nullptr; - screen.pen = Pen(255, 0, 0); - for (unsigned int i = 0; i < (ms_end - ms_start); i++) { - screen.pen = Pen(i * 5, 255 - (i * 5), 0); - screen.rectangle(Rect(i * 3 + 1, SCREEN_HEIGHT - 3, 2, 2)); - } -#endif -} - -void render_sky() { - for (uint16_t column = 0; column < SCREEN_WIDTH; column++) { - Vec2 ray = ray_cache[column]; - // ray.normalize(); // WHY? Has no visual impact - - float r = std::atan2(ray.x, ray.y); - r = (r > 0.0f ? r : (2.0f * pi + r)) * 360.0f / (2.0f * pi); - - Point uv(24 + (int(r * 3.0f) % 16), 160 - 32); - - screen.stretch_blit_vspan(screen.sprites, uv, 32, Point(column, 0), HORIZON + OFFSET_TOP); // TODO: blit from spritesheet? - - // Apply radial darkness to simulate directional sunset - uint8_t fade = std::max(-120, std::min(120, std::abs(int(r) - 120))) + 60; // calculate a `fog` based on angle - screen.pen = Pen(12, 33, 52, fade); - screen.line(Point(column, 0), Point(column, OFFSET_TOP + HORIZON)); - } -} - -void render_stars() { - // Get the player's facing angle in degrees from 0 to 359 - float r = std::atan2(player1.direction.x, player1.direction.y); - r = (r > 0.0f ? r : (2.0f * pi + r)) * 360.0f / (2.0f * pi); - screen.pen = Pen(255, 255, 255, 255); - - for(Star& star : stars) { - // If the stars radial X position is within our field of view - if ((180 - std::abs(std::abs(r - star.position.x) - 180)) < 45) { - // Get the difference between the star and player angle as degrees, signed - int x = (int)r - star.position.x + 180; - x = x - std::floor(float(x) / 360.0f) * 360; - x -= 180; - - // Convert the degrees to screen columns - x = 80 + (x / 45.0f) * 80; - screen.alpha = star.brightness; - screen.pixel(Point( - x, - star.position.y * 2 - )); - } - } - screen.alpha = 255; -} - -void render_world(uint32_t time) { - float perpendicular_wall_distance, wall_x; - Point player_map_location((int32_t)std::floor(player1.position.x), (int32_t)std::floor(player1.position.y)); - Point map_location; - Point last_map_location(-1, -1); -#ifdef AMBIENT_OCCLUSION - int last_side = -1; - float last_wall_distance = 0; -#endif - - for (uint16_t column = 0; column < SCREEN_WIDTH; column++) { // trace SCREEN_WIDTH rays from left to right - // calculate the amount we need to scale the plane_x/y camera displacement - // this gives us a step along the camera displacement that corresponds to the current ray - map_location = player_map_location; - Vec2 ray = ray_cache[column]; - - Vec2 delta_dist( - std::abs(1.0f / ray.x), - std::abs(1.0f / ray.y) - ); - - Vec2 side_dist(0, 0); - int8_t step_x, step_y; - - if (ray.x < 0) { - step_x = -1; - side_dist.x = (player1.position.x - map_location.x) * delta_dist.x; - } - else - { - step_x = 1; - side_dist.x = (map_location.x + 1.0f - player1.position.x) * delta_dist.x; - } - - if (ray.y < 0) { - step_y = -1; - side_dist.y = (player1.position.y - map_location.y) * delta_dist.y; - } - else - { - step_y = 1; - side_dist.y = (map_location.y + 1.0f - player1.position.y) * delta_dist.y; - } - - bool hit = false; - - int side = 0; - for (int s = 0; s < MAX_RAY_STEPS; s++) { - - if (side_dist.x < side_dist.y) { - side_dist.x += delta_dist.x; - map_location.x += step_x; - side = 0; - } - else - { - side_dist.y += delta_dist.y; - map_location.y += step_y; - side = 1; - } - - if (map.has_flag(map_location, TileFlags::WALL)) { - hit = true; - break; - } - } - - if (hit) { - uint8_t texture_wall = map_layer_walls->tile_at(map_location) - 1;// tile & 0x0f; - - if (side == 0) { - perpendicular_wall_distance = ((float)map_location.x - player1.position.x + (1 - step_x) / 2.0f) / ray.x; - wall_x = player1.position.y + perpendicular_wall_distance * ray.y; - } - else { - perpendicular_wall_distance = ((float)map_location.y - player1.position.y + (1 - step_y) / 2.0f) / ray.y; - wall_x = player1.position.x + perpendicular_wall_distance * ray.x; - } - - wall_x -= std::floor(wall_x); - - // While the perpendicular wall distance prevents fish-eye effect, generally we want - // lighting and distance based overlay effects to use the "real" wall distance - // otherwise the player can see further out of the corner of their eye - // real_wall_distance = perpendicular_wall_distance / cos(atan2(player1.direction.x, player1.direction.y)) - atan2(ray.x, ray.y); - - int wall_half_height = (int)((float)HORIZON / perpendicular_wall_distance); - int start_y = HORIZON - wall_half_height; - int end_y = HORIZON + wall_half_height; - - z_buffer[column] = perpendicular_wall_distance; - -#ifdef AMBIENT_OCCLUSION - mask.pen = 200; - - float line_distance = std::abs(perpendicular_wall_distance - last_wall_distance); - - int width = wall_half_height / 8.0f; - - if (column > 0 && (side != last_side) && line_distance < 0.5f && !(map_location.x == last_map_location.x && map_location.y == last_map_location.y)) { - for (int c = column - width; c < column + width; c++) { - int alpha = (std::abs(column - c) * 160) / width; - mask.pen = 160 - alpha; - mask.line(Point(c, start_y + OFFSET_TOP), Point(c, end_y + OFFSET_TOP)); - }; - } - else { - for (int r = end_y - width; r < end_y + width; r++) { - int alpha = (std::abs(end_y - r) * 160) / width; - mask.pen = 160 - alpha; - mask.pixel(Point(column, r + OFFSET_TOP)); - } - } - - last_side = side; - last_wall_distance = perpendicular_wall_distance; -#endif - - last_map_location = map_location; - - /* draw the walls */ - - // TODO: add mipmap support? automatic based on scale? - - // texture_wall - // - // 0 = mossy stone - // 1 = crumbled brick - // 2 = good brick - // 3 = spoopy door - // 4 = good brick support - uint16_t texture_offset_x = texture_wall * 32; - Point uv = Point(uint16_t(wall_x * 32.0f) + texture_offset_x, 0); - - screen.stretch_blit_vspan(screen.sprites, uv, 32, Point(column, start_y + OFFSET_TOP), end_y - start_y); // TODO Blit from Spritesheet - - float wall_distance = perpendicular_wall_distance / MAX_RAY_STEPS; - float alpha = wall_distance * 255.0f; - screen.pen = Pen(0, 0, 0, int(alpha)); - screen.line(Point(column, start_y + OFFSET_TOP), Point(column, end_y + OFFSET_TOP)); - - Vec2 floor_wall(map_location.x, map_location.y); - - if (side == 0 && ray.x > 0) { - floor_wall.y += wall_x; - } - else if (side == 0 && ray.x < 0) { - floor_wall.x += 1.0f; - floor_wall.y += wall_x; - } - else if (side == 1 && ray.y > 0) { - floor_wall.x += wall_x; - } - else { - floor_wall.x += wall_x; - floor_wall.y += 1.0f; - } - - // Draw the floor - for (int y = end_y + 1; y < VIEW_HEIGHT + 1; y++) { - float distance = (float)VIEW_HEIGHT / (2.0f * y - VIEW_HEIGHT); - float weight = distance / perpendicular_wall_distance; - - Vec2 current_floor( - weight * floor_wall.x + (1.0f - weight) * player1.position.x, - weight * floor_wall.y + (1.0f - weight) * player1.position.y - ); - - // Get the tile-relative x/y texture coordinates - Point tile_uv( - (current_floor.x - std::floor(current_floor.x)) * 32, - (current_floor.y - std::floor(current_floor.y)) * 32 - ); - - uint8_t floor_texture = map_layer_floor->tile_at(Point(int(current_floor.x), int(current_floor.y))) - 1; - //uint8_t floor_texture = get_map_tile(point(int(current_floor.x), int(current_floor.y))) & 0x0f; - - Point floor_texture_sprite( - 32 * floor_texture, - 32 - ); - // Get the distance from the player to the point on the floor - // and use this to create a distance shadowing effect - // dist = current_floor - player1.position; - // p_distance = dist.length(); - - int fragment_x = floor_texture_sprite.x + tile_uv.x; - int fragment_y = floor_texture_sprite.y + tile_uv.y; - - - uint8_t fragment_c_idx = *screen.sprites->ptr(fragment_x, fragment_y); - screen.pen = screen.sprites->palette[fragment_c_idx]; - screen.pixel(Point(column, y - 1 + OFFSET_TOP)); - - float floor_distance = distance / MAX_RAY_STEPS; - - screen.pen = Pen(0, 0, 0, int(floor_distance * 255.0f)); - screen.pixel(Point(column, y - 1 + OFFSET_TOP)); - } - } - } -} - -void render_sprites(uint32_t time) { - -#ifdef __Z_DEBUG__ - for(auto x = 0u; x < screen.bounds.w; x++) { - float d = z_buffer[x]; - uint8_t a = (d / 9.0f) * 255; - uint8_t b = 255 - a; - screen.pen = Pen(a, 0, b); - screen.line(Point(x, 0), Point(x, 10)); - } -#endif - - // Calculate distance from player to each sprite - for (auto i = 0u; i < NUM_SPRITES; i++) { - Vec2 sprite_distance( - map_sprites[i].position.x - player1.position.x, - map_sprites[i].position.y - player1.position.y - ); - map_sprites[i].distance = (sprite_distance.x * sprite_distance.x) + (sprite_distance.y * sprite_distance.y); - } - - // sort the sprites by distance - std::sort(map_sprites.begin(), map_sprites.end()); - - screen.clip = Rect(0, 0, screen.bounds.w, VIEW_HEIGHT + OFFSET_TOP); - - for (auto &psprite : map_sprites) { - if(!psprite.active) continue; - Rect bounds; - int sprite_width, sprite_height; - float factor = 1.0f; - - // Give the larger sprites a better view distance - float max_distance = (psprite.texture == FULL_TREE || psprite.texture == MATURE_TREE) ? MAX_RAY_STEPS : (MAX_RAY_STEPS / 2); - - if(psprite.type == WASP) { - max_distance = MAX_RAY_STEPS * 2; - } - - float distance = std::min(max_distance, psprite.distance); - if (distance >= max_distance) { - continue; - } - - // Get the player-relative position of the sprite - Vec2 relative_position = psprite.position - player1.position; - - Vec2 screen_transform( - player1.inverse_det * (player1.direction.y * relative_position.x - player1.direction.x * relative_position.y), - player1.inverse_det * (-player1.camera.y * relative_position.x + player1.camera.x * relative_position.y) - ); - - // Skip any sprites which are behind the player - if (screen_transform.y <= 0.01f) { - continue; - } - - bounds = sprite_bounds[(unsigned int)psprite.texture]; - - if(psprite.type == SPRAY) { - factor = 1.0f - (psprite.health / MAX_SPRAY_HEALTH); - sprite_height = std::abs(int(bounds.h * factor * factor / screen_transform.y)); - sprite_width = sprite_height; - } - else { - sprite_height = std::abs(int(bounds.h * SPRITE_SCALE / screen_transform.y)); - sprite_width = ((float)bounds.w / (float)bounds.h) * sprite_height; - } - - // Unused? - //int sprite_top_y = ((VIEW_HEIGHT - bounds.h) * SPRITE_SCALE) / screen_transform.y; - - // Get the screen-space position of the sprites base on the floor - Vec2 screen_pos( - (SCREEN_WIDTH / 2) * (1 + screen_transform.x / screen_transform.y), - HORIZON + (HORIZON / screen_transform.y) - ); - -#ifdef __DEBUG_SPRITE_ORIGIN__ - // DEBUG: Plot the sprite's base with a red dot - screen.alpha = 255 - int(255 * distance / max_distance); - screen.pen = Pen(255, 0, 0); - screen.pixel(Point(screen_pos.x, screen_pos.y)); -#endif - - // offset screen coordinate with sprite bounds - screen_pos -= Vec2(sprite_width / 2, sprite_height); - - if(psprite.type == SPRAY) { - screen_pos.y -= 43 / screen_transform.y; - } - - Rect dest(screen_pos.x, screen_pos.y + OFFSET_TOP, sprite_width, sprite_height); - - // Create a clipping rectangle around the sprite bounds - screen.clip.x = std::max((int16_t)0, int16_t(screen_pos.x)); - screen.clip.w = std::min(SCREEN_WIDTH, uint16_t(screen_pos.x + sprite_width)) - screen.clip.x; - - bool start = true; - int end = screen.clip.x + screen.clip.w; - for(int x = screen.clip.x; x < end; x++) { - if(screen_transform.y > z_buffer[x]) { - if(start) { - screen.clip.x++; - screen.clip.w--; - } else { - screen.clip.w -= end - x; - break; - } - } else { - start = false; - } - } - - SpriteTransform transform = SpriteTransform::NONE; - - if(psprite.type == WASP) { - float angle = psprite.position.angle_to(player1.position); - angle += psprite.rotation; - angle -= 22.5f * pi / 180.0f; // Correct angle of rotation by 45deg / 2 - - // Clamp from 0.0 to 2 * pi - while(angle < 0) {angle += 2 * pi;} - while(angle > 2 * pi) {angle -= 2 * pi;} - - angle *= (180.0f / pi); - int facing = (360 - angle) + 22; - facing = facing / 45; - if(facing > 4) { - facing = 4 - (facing - 4); - transform = SpriteTransform::HORIZONTAL; - } - if(facing < 0) { - facing = 0; - } - bounds.x = facing * 64; - psprite.size = !psprite.size; - bounds.y = psprite.size * 64; - } - - if(screen.clip.w && bounds.w && dest.w) { - screen.sprites = psprite.type == WASP ? sprites_wasp : sprites_world; //sprite_source[(unsigned int)psprite.texture]; - if(psprite.type == PLANT) { - screen.sprites->palette[11] = cols_a[psprite.color]; - screen.sprites->palette[12] = cols_b[psprite.color]; - } else if(psprite.type == SPRAY) { - screen.alpha = 128 - (128 * factor); - } - screen.stretch_blit(screen.sprites, bounds, dest, transform); - if(psprite.type == PLANT) { - screen.sprites->palette[11] = Pen(0x15, 0x98, 0x5d, 200); - screen.sprites->palette[12] = Pen(0x00, 0x7f, 0x43, 200); - } else if(psprite.type == SPRAY) { - screen.alpha = 255; - } - } - } - - screen.clip = Rect(0, 0, screen.bounds.w, VIEW_HEIGHT + OFFSET_TOP); - screen.sprites = sprites_world; -} - -/* Exclusively for blurring the ambient occlusion mask */ -void blur(uint8_t passes) { - uint8_t last; - - for (uint8_t pass = 0; pass < passes; pass++) { - uint8_t *p = (uint8_t *)mask.data; - for (uint16_t y = 0; y < SCREEN_HEIGHT; y++) { - last = *p; - p++; - - for (uint16_t x = 1; x < SCREEN_WIDTH - 1; x++) { - *p = (*(p + 1) + last + *p + *p) >> 2; - last = *p; - p++; - } - - p++; - } - } - - // vertical - for (uint8_t pass = 0; pass < passes; pass++) { - for (uint16_t x = 0; x < SCREEN_WIDTH; x++) { - uint8_t *p = (uint8_t *)mask.data + x; - - last = *p; - p += SCREEN_WIDTH; - - for (uint16_t y = 1; y < SCREEN_HEIGHT - 1; y++) { - *p = (*(p + SCREEN_WIDTH) + last + *p + *p) >> 2; - last = *p; - p += SCREEN_WIDTH; - } - } - } -} diff --git a/examples/raycaster/raycaster.hpp b/examples/raycaster/raycaster.hpp deleted file mode 100644 index 68bdb5b9c..000000000 --- a/examples/raycaster/raycaster.hpp +++ /dev/null @@ -1,104 +0,0 @@ -#pragma once - -#include - -#include "32blit.hpp" - -constexpr float M_PI_H = 1.5707963267948966f; - -constexpr float EPSILON = 0.00000001f; - -#ifdef PICO_BOARD -constexpr uint16_t OFFSET_TOP = 30; -constexpr uint16_t SCREEN_WIDTH = 120; -constexpr uint16_t SCREEN_HEIGHT = 120; -constexpr uint16_t NUM_SPRITES = 1000; -constexpr uint16_t NUM_STARS = 50; -#define AMBIENT_OCCLUSION // Paints into a mask with a blur pass, disable for a slight performance boost -//#define SHOW_FPS // Frame time is pretty high on PicoSystem, so just turn off the FPS meter :D -#else -constexpr uint16_t OFFSET_TOP = 0; -constexpr uint16_t SCREEN_WIDTH = 160; -constexpr uint16_t SCREEN_HEIGHT = 120; -constexpr uint16_t NUM_SPRITES = 5000; -constexpr uint16_t NUM_STARS = 100; -#define AMBIENT_OCCLUSION -//#define SHOW_FPS -#endif - -constexpr uint8_t MAX_SPRAY = 100; // Uses capacity from NUM_SPRITES -constexpr uint8_t MAX_ENEMIES = 10; // Uses capacity from NUM_SPRITES - -constexpr float MAX_SPRAY_HEALTH = 128; - -constexpr uint16_t VIEW_HEIGHT = SCREEN_HEIGHT - OFFSET_TOP - 24; -constexpr float SPRITE_SCALE = float(VIEW_HEIGHT) / 60.0f; - -constexpr uint16_t HORIZON = VIEW_HEIGHT / 2; -constexpr uint8_t TEXTURE_WIDTH = 8; -constexpr uint8_t TEXTURE_HEIGHT = 8; -constexpr uint8_t TEXTURE_SCALE = 1; - -constexpr uint8_t MAP_WIDTH = 16; -constexpr uint8_t MAP_HEIGHT = 16; -constexpr uint8_t MAX_RAY_STEPS = 24; //11 //sqrt((MAP_WIDTH ** 2) + (MAP_HEIGHT ** 2)) - -struct Entity { - blit::Vec2 position; - blit::Vec2 velocity; - float rotation; - float health; -}; - -struct Player : Entity { - blit::Vec2 direction; - blit::Vec2 camera; - float inverse_det; - bool spraying; - bool facing; -}; - -enum SpriteType { - PLANT = 0, - WASP = 1, - SPRAY = 2 -}; - -enum SpriteTexture : uint8_t { - FULL_TREE = 0, - MATURE_TREE = 1, - TALL_SHRUB = 2, - SHORT_SHRUB = 3, - TALL_GASS = 4, - MID_GRASS = 5, - SMOL_GRASS = 6, - ANGRY_WASP = 7, - BUGSPRAY = 8 -}; - -struct Sprite : Entity { - uint8_t size; - SpriteTexture texture; - SpriteType type; - uint8_t color; - float distance; - bool active; - bool operator < (const Sprite& rhs) const { return distance > rhs.distance; }; -}; - -struct Star { - blit::Point position; - uint8_t brightness; -}; - -void init(); -void update(uint32_t time); -void render(uint32_t time); - -void render_world(uint32_t time); -void render_sprites(uint32_t time); -void render_spray(uint32_t time); -void render_sky(); -void render_stars(); - -void blur(uint8_t passes); diff --git a/examples/raycaster/raycaster.png b/examples/raycaster/raycaster.png deleted file mode 100644 index fb69671be..000000000 Binary files a/examples/raycaster/raycaster.png and /dev/null differ diff --git a/examples/rotozoom/CMakeLists.txt b/examples/rotozoom/CMakeLists.txt deleted file mode 100644 index a01fcfad9..000000000 --- a/examples/rotozoom/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (rotozoom) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (rotozoom rotozoom.cpp) -blit_metadata (rotozoom metadata.yml) diff --git a/examples/rotozoom/metadata.yml b/examples/rotozoom/metadata.yml deleted file mode 100644 index aa01b610f..000000000 --- a/examples/rotozoom/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Rotozoom -description: The classic rotating and zooming demo effect on the 32blit logo. -author: pimoroni -splash: - file: rotozoom.png -icon: - file: rotozoom-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo \ No newline at end of file diff --git a/examples/rotozoom/rotozoom-icon.png b/examples/rotozoom/rotozoom-icon.png deleted file mode 100644 index f38bb93f3..000000000 Binary files a/examples/rotozoom/rotozoom-icon.png and /dev/null differ diff --git a/examples/rotozoom/rotozoom.cpp b/examples/rotozoom/rotozoom.cpp deleted file mode 100644 index fab8986f8..000000000 --- a/examples/rotozoom/rotozoom.cpp +++ /dev/null @@ -1,143 +0,0 @@ - -#include -#include -#include -#include - - -#include "rotozoom.hpp" - -using namespace blit; - -uint8_t logo[16][16] = { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 2, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0}, - {0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 2, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 1, 0, 0, 0, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0}, - {0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0}, - {0, 0, 2, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0}, - {0, 0, 2, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0}, - {0, 0, 2, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -}; - -uint8_t mask_buffer[320 * 240]; -Surface hires_mask(mask_buffer, PixelFormat::M, Size(320, 240)); -Surface lores_mask(mask_buffer, PixelFormat::M, Size(160, 120)); -Surface mask = hires_mask; - -/* setup */ -void init() { - set_screen_mode(hires); -} - -void rotozoom(uint32_t time_ms) { - static float angle = 0.0f; - - static Pen palette[] = { Pen(0, 0, 0), Pen(255, 255, 255), Pen(0, 255, 0) }; - - int32_t c = cosf(angle * pi / 180.0f) * 1024; - int32_t s = sinf(angle * pi / 180.0f) * 1024; - - angle += 0.25f; - angle = angle >= 360.0f ? 0.0f : angle; - - Point p; - - int16_t w = screen.bounds.w; - int16_t h = screen.bounds.h; - - int16_t hw = w / 2; - int16_t hh = h / 2; - - uint32_t o = 0; - for (p.y = 0; p.y < h; p.y++) { - for (p.x = 0; p.x < w; p.x++) { - uint8_t u = ((((p.x - hw) * c - (p.y - hh) * s) * s) >> 20) & 0b1111; - uint8_t v = ((((p.x - hw) * s + (p.y - hh) * c) * s) >> 20) & 0b1111; - - uint8_t pi = logo[15 - u][v]; - - // slower to call the pixel routine due to extra overhead of the function - // call and clipping - // - screen.pen(palette[pi]); - // - screen.pixel(p); - - // however we know our coordinates are within bounds so we can call the - // pen blend function (pbf) directly for a big speed up! - screen.pbf(&palette[pi], &screen, o, 1); - - o++; - } - } -} - -int tick_count = 0; -void render(uint32_t time_ms) { - screen.alpha = 255; - screen.mask = nullptr; - screen.pen = Pen(0, 0, 0, 255); - screen.clear(); - - mask.pen = Pen(50); - mask.clear(); - mask.pen = Pen(255); - Point centre = Point(160 + sinf(time_ms / 200.0f) * 40, 120 + cosf(time_ms / 200.0f) * 40); - mask.circle(centre, 100); - - //screen.mask = &mask; - - uint32_t ms_start = now(); - - rotozoom(time_ms); - - uint32_t ms_end = now(); -/* - for (auto y = 0; y < 10; y++) { - for (auto x = 0; x < 10; x++) { - float s = (sin(time_ms / 1000.0f) * 2.0f) + 3.0f; - screen.sprite(Point(x, y), Point(x * 8 * s + 160, y * 8 * s + 120), Point(40, 40), Vec2(s, s)); - } - }*/ - - screen.mask = nullptr; - - - // draw FPS meter - screen.pen = Pen(0, 0, 0, 200); - screen.rectangle(Rect(5, 5, 20, 16)); - screen.pen = Pen(255, 0, 0); - std::string fms = std::to_string(ms_end - ms_start); - screen.text(fms, minimal_font, Rect(10, 10, 10, 16)); - - int block_size = 4; - for (uint32_t i = 0; i < (ms_end - ms_start); i++) { - screen.pen = Pen(i * 5, 255 - (i * 5), 0); - screen.rectangle(Rect(i * (block_size + 1) + 1, screen.bounds.h - block_size - 1, block_size, block_size)); - } - -} - -void update(uint32_t time) { - static uint32_t last_buttons = 0; - - if (buttons != last_buttons) { - if ((buttons & DPAD_UP)) { - set_screen_mode(lores); - mask = lores_mask; - } - else { - set_screen_mode(hires); - mask = hires_mask; - } - } - - last_buttons = buttons; -} diff --git a/examples/rotozoom/rotozoom.hpp b/examples/rotozoom/rotozoom.hpp deleted file mode 100644 index 86285b11b..000000000 --- a/examples/rotozoom/rotozoom.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include - -#include "32blit.hpp" - -void init(); -void update(uint32_t time); -void render(uint32_t time); diff --git a/examples/rotozoom/rotozoom.png b/examples/rotozoom/rotozoom.png deleted file mode 100644 index 9a77b6914..000000000 Binary files a/examples/rotozoom/rotozoom.png and /dev/null differ diff --git a/examples/saves/CMakeLists.txt b/examples/saves/CMakeLists.txt deleted file mode 100644 index 111f09060..000000000 --- a/examples/saves/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ - -cmake_minimum_required(VERSION 3.9) -project (saves) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) - -blit_executable (saves saves.cpp) -blit_metadata (saves metadata.yml) \ No newline at end of file diff --git a/examples/saves/metadata.yml b/examples/saves/metadata.yml deleted file mode 100644 index d7eb8a11a..000000000 --- a/examples/saves/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Saves -description: Save data example. -author: daft_freak -splash: - file: ../no-image.png -icon: - file: ../no-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo \ No newline at end of file diff --git a/examples/saves/saves.cpp b/examples/saves/saves.cpp deleted file mode 100644 index 2a15e651c..000000000 --- a/examples/saves/saves.cpp +++ /dev/null @@ -1,53 +0,0 @@ -#include - -#include "saves.hpp" - -using namespace blit; - -// The data you want to save. Should not contain any pointers or other data that can't be written to a file as-is. -struct MyGameSave { - char name[10]; - int32_t score; -}; - -MyGameSave save_data; - -void init() { - // Attempt to load the first save slot. - if(read_save(save_data)) { - // Loaded successfully! - } else { - // No save file or it failed to load, set up some defaults. - strncpy(save_data.name, "My Name", 10); - save_data.score = 0; - } -} - -void render(uint32_t time_ms) { - screen.pen = Pen(20, 30, 40); - screen.clear(); - - screen.alpha = 255; - screen.pen = Pen(255, 255, 255); - screen.rectangle(Rect(0, 0, 320, 14)); - - screen.pen = Pen(0, 0, 0); - screen.text("Saves", minimal_font, Point(5, 4)); - - screen.pen = Pen(255, 255, 255); - char buf[100]; - snprintf(buf, 100, "Hello %s\n\nHold A to win!\n\nCurrent score: %i", save_data.name, save_data.score); - screen.text(buf, minimal_font, Point(screen.bounds.w / 2, screen.bounds.h / 2), false, TextAlign::center_center); -} - -void update(uint32_t time) { - // Give away some points - if(buttons & Button::A) { - save_data.score++; - } - - // Save all those points we gave away - if(buttons.released & Button::A) { - write_save(save_data); - } -} \ No newline at end of file diff --git a/examples/saves/saves.hpp b/examples/saves/saves.hpp deleted file mode 100644 index b791bb454..000000000 --- a/examples/saves/saves.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include - -#include "32blit.hpp" - -void init(); -void update(uint32_t time); -void render(uint32_t time); \ No newline at end of file diff --git a/examples/scrolly-tile/CMakeLists.txt b/examples/scrolly-tile/CMakeLists.txt deleted file mode 100644 index 703f5bf65..000000000 --- a/examples/scrolly-tile/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (scrolly-tile) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (scrolly-tile scrolly-tile.cpp) -blit_metadata (scrolly-tile metadata.yml) diff --git a/examples/scrolly-tile/metadata.yml b/examples/scrolly-tile/metadata.yml deleted file mode 100644 index f8d007325..000000000 --- a/examples/scrolly-tile/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Rainbow Ascent -description: The Dark Souls of procedurally generated vertical jumping puzzles. Good luck. -author: pimoroni -splash: - file: rainbow-ascent.png -icon: - file: rainbow-ascent-icon.png -version: v1.1.0 -url: https://github.com/32blit/32blit-sdk -category: game diff --git a/examples/scrolly-tile/rainbow-ascent-icon.png b/examples/scrolly-tile/rainbow-ascent-icon.png deleted file mode 100644 index e676ee5d5..000000000 Binary files a/examples/scrolly-tile/rainbow-ascent-icon.png and /dev/null differ diff --git a/examples/scrolly-tile/rainbow-ascent.png b/examples/scrolly-tile/rainbow-ascent.png deleted file mode 100644 index f7fd03bcd..000000000 Binary files a/examples/scrolly-tile/rainbow-ascent.png and /dev/null differ diff --git a/examples/scrolly-tile/scrolly-tile.cpp b/examples/scrolly-tile/scrolly-tile.cpp deleted file mode 100644 index d0db2f7d6..000000000 --- a/examples/scrolly-tile/scrolly-tile.cpp +++ /dev/null @@ -1,866 +0,0 @@ -#include -#include "scrolly-tile.hpp" -#include "graphics/color.hpp" - -using namespace blit; - -#define __AUDIO__ - -#define TILE_W 10 -#define TILE_H 10 -#define TILE_SOLID 0b1 << 7 -#define TILE_WATER 0b1 << 6 - -// Bitmask for keeping track of adjacent tiles -// in a single uint8_t -#define TILE_LEFT 1 << 7 -#define TILE_RIGHT 1 << 6 -#define TILE_BELOW 1 << 5 -#define TILE_ABOVE 1 << 4 -#define TILE_ABOVE_LEFT 1 << 3 -#define TILE_ABOVE_RIGHT 1 << 2 -#define TILE_BELOW_LEFT 1 << 1 -#define TILE_BELOW_RIGHT 1 << 0 - -#define PLAYER_W 2 -#define PLAYER_H 4 - -#define TILES_X 16 -#define TILES_Y 15 - -#define PLAYER_TOP (player_position.y) -#define PLAYER_BOTTOM (player_position.y + PLAYER_H) -#define PLAYER_RIGHT (player_position.x + PLAYER_W) -#define PLAYER_LEFT (player_position.x) - -#define RANDOM_TYPE_HRNG 0 -#define RANDOM_TYPE_PRNG 1 - -#define PASSAGE_COUNT 5 - -const std::string TITLE = "RAINBOW ASCENT"; - -// Number of times a player can jump sequentially -// including mid-air jumps and the initial ground -// or wall jump -#define MAX_JUMP 3 - -uint8_t current_random_source = RANDOM_TYPE_PRNG; -uint32_t current_random_seed = 0x64063701; - -// All the art is rainbow fun time, so we don't need -// much data about each tile. -// Rounded corners are also procedural depending upon -// tile proximity. -// The screen allows for 16x12 10x10 tiles, but we -// use an extra 3 vertically: -// +1 - because an offset row means we can see 13 rows total -// +2 - because tile features need an adjacent row to generate from -// IE: when our screen is shifted down 5px you can see 13 -// rows and both the top and bottom visible row are next to the -// additional two invisible rows which govern how corners are rounded. -uint8_t tiles[TILES_X * TILES_Y] = { 0 }; - -uint32_t current_row = 0; - -Timer state_update; -Point tile_offset(0, 0); - -struct SaveData { - uint32_t highscore; -} save_data; - -Vec2 player_position(0.0f, 0.0f); -Vec2 player_velocity(0.0f, 0.0f); -Vec2 jump_velocity(0.0f, -2.0f); -Point camera_offset(0, 0); -uint8_t player_jump_count = 0; -uint32_t player_progress = 0; -bool player_on_floor = false; -enum enum_player_state { - ground = 0, - near_wall_left = 1, - wall_left = 2, - near_wall_right = 3, - wall_right = 4, - air = 5 -}; -enum_player_state player_state = ground; - -uint8_t last_passage_width = 0; - -float water_level = 0; - -// Used for tracking where the engine has linked a finished passage -// back to those still active. -uint16_t linked_passage_mask = 0; - -uint8_t passages[PASSAGE_COUNT] = {0}; - -// Keep track of game state -enum enum_state { - menu = 0, - play = 1, - dead = 2 -}; -enum_state game_state = enum_state::menu; - -using tile_callback = uint8_t (*)(uint8_t tile, uint8_t x, uint8_t y, void *args); - -uint32_t prng_lfsr = 0; -const uint16_t prng_tap = 0x74b8; - -uint32_t get_random_number() { - switch(current_random_source) { - default: - return 0; - case RANDOM_TYPE_HRNG: - return blit::random(); - case RANDOM_TYPE_PRNG: - uint8_t lsb = prng_lfsr & 1; - prng_lfsr >>= 1; - - if (lsb) { - prng_lfsr ^= prng_tap; - } - return prng_lfsr; - } -} - -void for_each_tile(tile_callback callback, void *args) { - for (auto y = 0; y < TILES_Y; y++) { - for(auto x = 0; x < TILES_X; x++) { - uint16_t index = (y * TILES_X) + x; - tiles[index] = callback(tiles[index], x, y, args); - } - } -} - -uint8_t get_tile_at(uint8_t x, uint8_t y) { - // Get the tile at a given x/y grid coordinate - if (x > 15) return TILE_SOLID; - if (y > TILES_Y) return 0; - uint16_t index = (y * TILES_X) + x; - return tiles[index]; -} - -uint8_t get_adjacent_tile_solid_flags(uint8_t x, uint8_t y) { - // TODO: avoid calls to get_tile_at and use offsets to find - // adjacent tiles more efficiently. - uint8_t feature_map = 0; - feature_map |= (get_tile_at(x - 1, y) & TILE_SOLID) ? TILE_LEFT : 0; - feature_map |= (get_tile_at(x + 1, y) & TILE_SOLID) ? TILE_RIGHT : 0; - feature_map |= (get_tile_at(x, y - 1) & TILE_SOLID) ? TILE_ABOVE : 0; - feature_map |= (get_tile_at(x, y + 1) & TILE_SOLID) ? TILE_BELOW : 0; - - feature_map |= (get_tile_at(x - 1, y - 1) & TILE_SOLID) ? TILE_ABOVE_LEFT : 0; - feature_map |= (get_tile_at(x + 1, y - 1) & TILE_SOLID) ? TILE_ABOVE_RIGHT : 0; - feature_map |= (get_tile_at(x - 1, y + 1) & TILE_SOLID) ? TILE_BELOW_LEFT : 0; - feature_map |= (get_tile_at(x + 1, y + 1) & TILE_SOLID) ? TILE_BELOW_RIGHT : 0; - return feature_map; -} - -uint8_t render_tile(uint8_t tile, uint8_t x, uint8_t y, void *args) { - // Rendering tiles is pretty simple and involves drawing rectangles - // in the right places. - // But a large amount of this function is given over to rounding - // corners depending upon the content of neighbouring tiles. - // This could probably be rewritten to use a lookup table? - Point offset = *(Point *)args; - - offset += camera_offset; - - auto tile_x = (x * TILE_W) + offset.x; - auto tile_y = (y * TILE_H) + offset.y; - - uint8_t feature_map = get_adjacent_tile_solid_flags(x, y); - - bool round_tl = (feature_map & (TILE_ABOVE_LEFT | TILE_ABOVE | TILE_LEFT)) == 0; - bool round_tr = (feature_map & (TILE_ABOVE_RIGHT | TILE_ABOVE | TILE_RIGHT)) == 0; - bool round_bl = (feature_map & (TILE_BELOW_LEFT | TILE_BELOW | TILE_LEFT)) == 0; - bool round_br = (feature_map & (TILE_BELOW_RIGHT | TILE_BELOW | TILE_RIGHT)) == 0; - - Pen color_base = hsv_to_rgba(((120 - tile_y) + 110.0f) / 120.0f, 0.5f, 0.8f); - - if(tile & TILE_SOLID) { - // Draw tiles without anti-aliasing to save code bloat - // Uses the rounded corner flags to miss a pixel for a - // basic rounded corner effect. - - screen.pen = color_base; - - // top row - int start_x = 0, w = TILE_W; - - if(round_tl) start_x++; - if(round_tr) w--; - screen.h_span(Point(tile_x + start_x, tile_y), w - start_x); - - // bottom row - start_x = 0; - w = TILE_W; - - if(round_bl) start_x++; - if(round_br) w--; - screen.h_span(Point(tile_x + start_x, tile_y + TILE_H - 1), w - start_x); - - // rest of the tile - screen.rectangle(Rect(tile_x, tile_y + 1, TILE_W, TILE_H - 2)); - - } else { - if(feature_map & TILE_ABOVE) { - // Draw the top left/right rounded inside corners - // for an empty tile. - if (feature_map & TILE_LEFT) { - screen.pen = color_base; - screen.pixel(Point(tile_x, tile_y)); - } - if (feature_map & TILE_RIGHT) { - screen.pen = color_base; - screen.pixel(Point(tile_x + TILE_W - 1, tile_y)); - } - } - if(feature_map & TILE_BELOW) { - // If we have a tile directly to the left and right - // of this one then it's a little pocket we can fill with water! - // TODO: Make this not look rubbish - if(feature_map & TILE_LEFT && feature_map & TILE_RIGHT) { - screen.pen = Pen(200, 200, 255, 128); - screen.rectangle(Rect(tile_x, tile_y + (TILE_H / 2), TILE_W, TILE_H / 2)); - } - // Draw the bottom left/right rounded inside corners - // for an empty tile. - if(feature_map & TILE_LEFT) { - screen.pen = color_base; - screen.pixel(Point(tile_x, tile_y + TILE_H - 1)); - } - if(feature_map & TILE_RIGHT) { - screen.pen = color_base; - screen.pixel(Point(tile_x + TILE_W - 1, tile_y + TILE_H - 1)); - } - } - } - - return tile; -} - -uint16_t generate_new_row_mask() { - uint16_t new_row_mask = 0x0000; - uint8_t passage_width = floorf(((sinf(current_row / 10.0f) + 1.0f) / 2.0f) * PASSAGE_COUNT); - - // Cut our consistent winding passage through the level - // by tracking the x coord of our passage we can ensure - // that it's always navigable without having to reject - // procedurally generated segments - for(auto p = 0; p < PASSAGE_COUNT; p++){ - if(p > passage_width) { - continue; - } - // Controls how far a passage can snake left/right - uint8_t turning_size = get_random_number() % 7; - - new_row_mask |= (0x8000 >> passages[p]); - - // At every new generation we choose to branch a passage - // either left or right, or let it continue upwards. - switch(get_random_number() % 3){ - case 0: // Passage goes right - while(turning_size--){ - if(passages[p] < TILES_X - 2){ - passages[p] += 1; - } - new_row_mask |= (0x8000 >> passages[p]); - } - break; - case 1: // Passage goes left - while(turning_size--){ - if(passages[p] > 1){ - passages[p] -= 1; - } - new_row_mask |= (0x8000 >> passages[p]); - } - break; - } - } - - // Whenever we have a narrowing of our passage we must check - // for orphaned passages and link them back to the ones still - // available, to avoid the player going up a tunnel that ends - // abruptly :( - // This routine picks a random passage from the ones remaining - // and routes every orphaned passage to it. - if(passage_width < last_passage_width) { - uint8_t target_passage = get_random_number() % (passage_width + 1); - uint8_t target_p_x = passages[target_passage]; - - for(auto i = passage_width; i < last_passage_width + 1; i++){ - new_row_mask |= (0x8000 >> passages[i]); - - int8_t direction = (passages[i] < target_p_x) ? 1 : -1; - - while(passages[i] != target_p_x) { - passages[i] += direction; - new_row_mask |= (0x8000 >> passages[i]); - } - } - } - last_passage_width = passage_width; - - current_row++; - return ~new_row_mask; -} - -void update_tiles() { - // Shift all of our tile rows down by 1 starting - // with the second-to-bottom tile which replaces - // the bottom-most tile. - for(auto y = TILES_Y - 2; y >= 0; y--){ - for(auto x = 0; x < TILES_X; x++){ - uint16_t tgt = ((y + 1) * TILES_X) + x; - uint16_t src = (y * TILES_X) + x; - tiles[tgt] = tiles[src]; - } - } - - uint16_t row_mask = generate_new_row_mask(); - - // Replace the very top row of tiles with our newly - // generated row mask. - for(auto x = 0; x < TILES_X; x++) { - if(row_mask & (1 << x)) { - tiles[x] = TILE_SOLID; - } - else { - tiles[x] = 0; - } - } -} - -void update_state(Timer &timer) { - if (game_state == enum_state::menu) { - tile_offset.y += 1; - } - - if (game_state == enum_state::play && (player_position.y < 70)) { - tile_offset.y += 1; - if(water_level > 10){ - water_level -= 1; - } - player_position.y += 1; - player_progress += 1; - } - - if(tile_offset.y >= 0) { - tile_offset.y = -10; - update_tiles(); - } -} - -bool place_player() { - // Try to find a suitable place to drop the player - // where they will be standing on solid ground - for(auto y = 10; y > 0; y--){ - for(auto x = 0; x < TILES_X; x++){ - uint16_t here = get_tile_at(x, y); - uint16_t below = get_tile_at(x, y + 1); - if(below & TILE_SOLID && (here & TILE_SOLID) == 0) { - player_position.x = (x * TILE_W) + 4; - player_position.y = (y * TILE_H) + tile_offset.y; - return true; - } - } - } - - return false; -} - -void new_level() { - prng_lfsr = current_random_seed; - - player_position.x = 80.0f; - player_position.y = float(screen.bounds.h - PLAYER_H); - player_velocity.x = 0.0f; - player_velocity.y = 0.0f; - player_progress = 0; - tile_offset.y = -10; - tile_offset.x = 0; - water_level = 0; - last_passage_width = 0; - current_row = 0; - - for(auto x = 0; x < 5; x++) { - passages[x] = (get_random_number() % 14) + 1; - } - - // Use update_tiles to create the initial game state - // instead of having a separate loop that breaks in weird ways - for(auto y = 0; y < TILES_Y; y++) { - update_tiles(); - } - - place_player(); -} - -void new_game() { - new_level(); - - game_state = enum_state::play; -} - -void init() { - set_screen_mode(lores); - - // Attempt to load the first save slot. - if (read_save(save_data)) { - // Loaded successfully! - } - else { - // No save file or it failed to load. - save_data.highscore = 0; - } - -#ifdef __AUDIO__ - channels[0].waveforms = Waveform::NOISE; - channels[0].frequency = 4200; - channels[0].attack_ms = 1; - channels[0].decay_ms = 1; - channels[0].sustain = 0xffff; - channels[0].release_ms = 1; - channels[0].trigger_attack(); - - channels[1].waveforms = Waveform::SQUARE; - channels[1].frequency = 0; - channels[1].attack_ms = 30; - channels[1].decay_ms = 100; - channels[1].sustain = 0; - channels[1].release_ms = 0; -#endif - state_update.init(update_state, 10, -1); - state_update.start(); - new_level(); -} - -uint8_t collide_player_lr(uint8_t tile, uint8_t x, uint8_t y, void *args) { - Point offset = *(Point *)args; - - auto tile_x = (x * TILE_W) + offset.x; - auto tile_y = (y * TILE_H) + offset.y; - - auto tile_top = tile_y; - auto tile_bottom = tile_y + TILE_H; - auto tile_left = tile_x; - auto tile_right = tile_x + TILE_W; - - if(tile & TILE_SOLID) { - uint8_t near_wall_distance = 2; - if(((PLAYER_BOTTOM > tile_top) && (PLAYER_BOTTOM < tile_bottom)) - || ((PLAYER_TOP > tile_top) && PLAYER_TOP < tile_bottom)){ - // Collide the left-hand side of the tile right of player - if(PLAYER_RIGHT > tile_left && (PLAYER_LEFT < tile_left)){ - // screen.pen = Pen(255, 255, 255, 100); - // screen.rectangle(rect(tile_x, tile_y, TILE_W, TILE_H)); - player_position.x = float(tile_left - PLAYER_W); - player_velocity.x = 0.0f; - player_state = wall_right; - } - else if(((PLAYER_RIGHT + near_wall_distance) > tile_left) && (PLAYER_LEFT < tile_left)) { - player_state = near_wall_right; - } - // Collide the right-hand side of the tile left of player - if((PLAYER_LEFT < tile_right) && (PLAYER_RIGHT > tile_right)) { - // screen.pen = Pen(255, 255, 255, 100); - // screen.rectangle(rect(tile_x, tile_y, TILE_W, TILE_H)); - player_position.x = float(tile_right); - player_velocity.x = 0.0f; - player_state = wall_left; - } - else if(((PLAYER_LEFT - near_wall_distance) < tile_right) && (PLAYER_RIGHT > tile_right)) { - player_state = near_wall_left; - } - } - } - - return tile; -} - -uint8_t collide_player_ud(uint8_t tile, uint8_t x, uint8_t y, void *args) { - Point offset = *(Point *)args; - - auto tile_x = (x * TILE_W) + offset.x; - auto tile_y = (y * TILE_H) + offset.y; - - auto tile_top = tile_y; - auto tile_bottom = tile_y + TILE_H; - auto tile_left = tile_x; - auto tile_right = tile_x + TILE_W; - - if(tile & TILE_SOLID) { - if((PLAYER_RIGHT > tile_left) && (PLAYER_LEFT < tile_right)){ - // Collide the bottom side of the tile above player - if(PLAYER_TOP < tile_bottom && PLAYER_BOTTOM > tile_bottom){ - player_position.y = float(tile_bottom); - player_velocity.y = 0; - } - // Collide the top side of the tile below player - if((PLAYER_BOTTOM > tile_top) && (PLAYER_TOP < tile_top)){ - player_position.y = float(tile_top - PLAYER_H); - player_velocity.y = 0; - player_jump_count = MAX_JUMP; - player_state = ground; - } - } - } - - return tile; -} - -void update(uint32_t time_ms) { - int32_t water_dist = player_position.y - (screen.bounds.h - water_level); - if (water_dist < 0) { - water_dist = 0; - } -#ifdef __AUDIO__ - channels[0].volume = 4000 + (sinf(float(time_ms) / 1000.0f) * 3000); -#endif - - if (game_state == enum_state::menu) { - if(buttons.pressed & Button::B) { - new_game(); - } - else if(buttons.pressed & Button::DPAD_UP) { - current_random_source = RANDOM_TYPE_PRNG; - new_level(); - } - else if(buttons.pressed & Button::DPAD_DOWN) { - current_random_source = RANDOM_TYPE_HRNG; - new_level(); - } - else if(buttons.pressed & Button::DPAD_RIGHT) { - if(current_random_source == RANDOM_TYPE_PRNG) { - current_random_seed++; - new_level(); - } - } - else if(buttons.pressed & Button::DPAD_LEFT) { - if(current_random_source == RANDOM_TYPE_PRNG) { - current_random_seed--; - new_level(); - } - } - return; - } - - if(game_state == enum_state::dead){ - if(buttons.pressed & Button::B) { - game_state = enum_state::menu; - } - return; - } - - if(game_state == enum_state::play){ - static enum_player_state last_wall_jump = enum_player_state::ground; -#ifdef __AUDIO__ - static float jump_sweep = 0.0; -#endif - - Vec2 movement(0, 0); - water_level += 0.05f; - jump_velocity.x = 0.0f; - - // Apply Gravity - player_velocity.y += 0.098f; - - if(buttons & Button::DPAD_LEFT) { - player_velocity.x -= 0.1f; - movement.x = -1; - - if(buttons & Button::DPAD_UP) { - if(player_state == wall_left - || player_state == near_wall_left) { - player_velocity.y -= 0.12f; - } - movement.y = -1; - } - } - if(buttons & Button::DPAD_RIGHT) { - player_velocity.x += 0.1f; - movement.x = 1; - - if(buttons & Button::DPAD_UP) { - if(player_state == wall_right - || player_state == near_wall_right) { - player_velocity.y -= 0.12f; - } - movement.y = -1; - } - } - if(buttons & Button::DPAD_DOWN) { - movement.y = 1; - } - - if(player_jump_count){ - if(buttons.pressed & Button::A) { - if(player_state == wall_left - || player_state == wall_right - || player_state == near_wall_left - || player_state == near_wall_right) { - enum_player_state wall_jump_state = (player_state == wall_left || player_state == near_wall_left) ? wall_left : wall_right; - jump_velocity.x = (wall_jump_state == wall_left) ? 1.2f : -1.2f; - if(last_wall_jump != wall_jump_state) { - player_jump_count = MAX_JUMP; - } - last_wall_jump = wall_jump_state; - } - player_velocity = jump_velocity; - player_state = air; - player_jump_count--; -#ifdef __AUDIO__ - channels[1].trigger_attack(); - jump_sweep = 1.0f; -#endif - } - } -#ifdef __AUDIO__ - if(jump_sweep > 0) { - channels[1].frequency = 880 - (880.0f * jump_sweep); - jump_sweep -= 0.05f; - } -#endif - - switch(player_state) { - case wall_left: - case wall_right: - case near_wall_left: - case near_wall_right: - if ((buttons & Button::DPAD_LEFT) && (player_state == wall_left || player_state == near_wall_left)){ - player_velocity.y *= 0.5f; - break; - } - if ((buttons & Button::DPAD_RIGHT) && (player_state == wall_right || player_state == near_wall_right)){ - player_velocity.y *= 0.5f; - break; - } - // Fall through to air friction - [[fallthrough]]; - case air: - // Air friction - player_velocity.y *= 0.98f; - player_velocity.x *= 0.91f; - break; - case ground: - // Ground friction - player_velocity *= 0.8f; - break; - } - - // Default state is in the air unless we collide - // with a wall or the ground - player_state = enum_player_state::air; - - player_position.x += player_velocity.x; - // Useful for debug since you can position the player directly - //player_position.x += movement.x; - - if(player_position.x <= 0){ - player_position.x = 0; - player_velocity.x = 0; - player_state = wall_left; - } - else if(player_position.x + PLAYER_W >= 160) { - player_position.x = float(160 - PLAYER_W); - player_velocity.x = 0; - player_state = wall_right; - - } - for_each_tile(collide_player_lr, (void *)&tile_offset); - - player_position.y += player_velocity.y; - // Useful for debug since you can position the player directly - //player_position.y += movement.y; - - if(player_position.y + PLAYER_H > screen.bounds.h || player_position.y > screen.bounds.h - water_level) { - game_state = enum_state::dead; - if (player_progress > save_data.highscore) { - save_data.highscore = player_progress; - write_save(save_data); // save save_data - } - } - for_each_tile(collide_player_ud, (void *)&tile_offset); - - if(screen.bounds.w < 160) { - uint8_t max_offset = 160 - screen.bounds.w; - camera_offset.x = -max_offset * player_position.x / screen.bounds.w; - } - } -} - -void render_summary(uint8_t text_left) { - std::string text = "Mode: "; - - if(current_random_source == RANDOM_TYPE_PRNG) { - text.append("Competitive"); - } else { - text.append("Practice"); - } - screen.text(text, minimal_font, Point(text_left, (screen.bounds.h / 2) + 20)); - - if(current_random_source == RANDOM_TYPE_PRNG) { - char buf[9]; - snprintf(buf, 9, "%08" PRIX32, current_random_seed); - text = "Seed: "; - text.append(buf); - screen.text(text, minimal_font, Point(text_left, (screen.bounds.h / 2) + 30)); - } - - text = "Press B"; - screen.text(text, minimal_font, Point(text_left, (screen.bounds.h / 2) + 50)); - - text = "Highscore: "; - text.append(std::to_string(save_data.highscore)); - text.append("cm"); - screen.text(text, minimal_font, Point(text_left, (screen.bounds.h / 2) + 40)); -} - -void render(uint32_t time_ms) { - uint8_t text_left = screen.bounds.w == 120 ? 5 : 10; - uint8_t title_spacing = screen.bounds.w == 120 ? 8 : 10; - - screen.pen = Pen(0, 0, 0); - screen.clear(); - - if (game_state == enum_state::menu) { - for_each_tile(render_tile, (void *)&tile_offset); - - // Draw the player - screen.pen = Pen(255, 255, 255); - screen.rectangle(Rect(player_position.x, player_position.y, PLAYER_W, PLAYER_H)); - screen.pen = Pen(255, 50, 50); - screen.rectangle(Rect(player_position.x, player_position.y, PLAYER_W, 1)); - - screen.pen = Pen(0, 0, 0, 200); - screen.clear(); - - uint8_t x = text_left; - for(auto c : TITLE) { - uint8_t y = 20 + (5.0f * sinf((time_ms / 250.0f) + (float(x) / TITLE.length() * 2.0f * pi))); - Pen color_letter = hsv_to_rgba((x - 10) / 140.0f, 0.5f, 0.8f); - screen.pen = color_letter; - char buf[2]; - buf[0] = c; - buf[1] = '\0'; - screen.text(buf, minimal_font, Point(x, y)); - x += title_spacing; - } - - screen.pen = Pen(255, 255, 255, 150); - - render_summary(text_left); - - return; - } - - Pen color_water = hsv_to_rgba(((120 - 120) + 110.0f) / 120.0f, 1.0f, 0.5f); - color_water.a = 255; - - if(water_level > 0){ - screen.pen = color_water; - screen.rectangle(Rect(0, screen.bounds.h - water_level, screen.bounds.w, water_level + 1)); - - for(auto x = 0; x < screen.bounds.w; x++){ - uint16_t offset = x + camera_offset.x + uint16_t(sinf(time_ms / 500.0f) * 5.0f); - if((offset % 5) > 0){ - screen.pixel(Point(x, screen.bounds.h - water_level - 1)); - } - if(((offset + 2) % 5) == 0){ - screen.pixel(Point(x, screen.bounds.h - water_level - 2)); - } - if(((offset + 3) % 5) == 0){ - screen.pixel(Point(x, screen.bounds.h - water_level - 2)); - } - } - } - - for_each_tile(render_tile, (void *)&tile_offset); - - // Draw the player - screen.pen = Pen(255, 255, 255); - screen.rectangle(Rect(player_position + camera_offset, Size(PLAYER_W, PLAYER_H))); - screen.pen = Pen(255, 50, 50); - screen.rectangle(Rect(player_position + camera_offset, Size(PLAYER_W, 1))); - - /* - // Show number of active passages - p = std::to_string(passage_width + 1); - p.append(" passages"); - screen.text(p, minimal_font, point(2, 10)); - */ - - if(water_level > 0){ - color_water.a = 100; - screen.pen = color_water; - screen.rectangle(Rect(0, screen.bounds.h - water_level, screen.bounds.w, water_level + 1)); - - for(auto x = 0; x < screen.bounds.w; x++){ - uint16_t offset = x + uint16_t(sinf(time_ms / 500.0f) * 5.0f); - if((offset % 5) > 0){ - screen.pixel(Point(x, screen.bounds.h - water_level - 1)); - } - if(((offset + 2) % 5) == 0){ - screen.pixel(Point(x, screen.bounds.h - water_level - 2)); - } - if(((offset + 3) % 5) == 0){ - screen.pixel(Point(x, screen.bounds.h - water_level - 2)); - } - } - } - - if(game_state == enum_state::dead) { - screen.pen = Pen(128, 0, 0, 200); - screen.rectangle(Rect(0, 0, screen.bounds.w, screen.bounds.h)); - screen.pen = Pen(255, 0, 0, 255); - screen.text("YOU DIED!", minimal_font, Point((screen.bounds.w / 2) - 20, (screen.bounds.h / 2) - 4)); - - // Round stats - screen.pen = Pen(255, 255, 255); - - screen.text("You climbed: " + std::to_string(player_progress) + "cm", minimal_font, Point(text_left, (screen.bounds.h / 2) + 10)); - - render_summary(text_left); - } - else - { - // Draw the HUD - screen.pen = Pen(255, 255, 255); - screen.text(std::to_string(player_progress) + "cm", minimal_font, Point(2, 2)); - - /* - // State debug info - text = "Jumps: "; - text.append(std::to_string(player_jump_count)); - screen.text(text, minimal_font, point(2, 12)); - - text = "State: "; - switch(player_state){ - case enum_player_state::ground: - text.append("GROUND"); - break; - case enum_player_state::air: - text.append("AIR"); - break; - case enum_player_state::near_wall_left: - text.append("NEAR L"); - break; - case enum_player_state::wall_left: - text.append("WALL L"); - break; - case enum_player_state::near_wall_right: - text.append("NEAR R"); - break; - case enum_player_state::wall_right: - text.append("WALL R"); - break; - } - screen.text(text, minimal_font, point(2, 22)); - */ - } -} diff --git a/examples/scrolly-tile/scrolly-tile.hpp b/examples/scrolly-tile/scrolly-tile.hpp deleted file mode 100644 index 8ca0a7e42..000000000 --- a/examples/scrolly-tile/scrolly-tile.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "32blit.hpp" diff --git a/examples/serial-debug/CMakeLists.txt b/examples/serial-debug/CMakeLists.txt deleted file mode 100644 index 78c240c90..000000000 --- a/examples/serial-debug/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (serial-debug) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (serial-debug serial-debug.cpp) -blit_metadata (serial-debug metadata.yml) \ No newline at end of file diff --git a/examples/serial-debug/metadata.yml b/examples/serial-debug/metadata.yml deleted file mode 100644 index f363a213d..000000000 --- a/examples/serial-debug/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Serial Debug -description: Fire serial data into the void. -author: pimoroni -splash: - file: serial-debug.png -icon: - file: serial-debug-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo \ No newline at end of file diff --git a/examples/serial-debug/serial-debug-icon.png b/examples/serial-debug/serial-debug-icon.png deleted file mode 100644 index 4175c455d..000000000 Binary files a/examples/serial-debug/serial-debug-icon.png and /dev/null differ diff --git a/examples/serial-debug/serial-debug.cpp b/examples/serial-debug/serial-debug.cpp deleted file mode 100644 index 283adcfe6..000000000 --- a/examples/serial-debug/serial-debug.cpp +++ /dev/null @@ -1,50 +0,0 @@ -#include -#include - -#include "serial-debug.hpp" -#include "graphics/color.hpp" - -using namespace blit; - -#define SCREEN_WIDTH 160 -#define SCREEN_HEIGHT 120 -#define COL1 5 -#define COL2 55 -#define COL3 105 - -#define ROW1 38 -#define ROW2 70 -#define ROW2_5 86 -#define ROW3 102 - - -void init() { - set_screen_mode(ScreenMode::lores); -} - - -void render(uint32_t time) { - char text_buf[100] = {0}; - - for(int b = 0; b < SCREEN_WIDTH; b++){ - for(int v = 0; v < SCREEN_HEIGHT; v++){ - screen.pen = blit::hsv_to_rgba(float(b) / (float)(SCREEN_WIDTH), 1.0f, float(v) / (float)(SCREEN_HEIGHT)); - screen.pixel(Point(b, v)); - } - } - - screen.text("Time:", minimal_font, Point(COL1, ROW1)); - - snprintf(text_buf, 100, "%" PRIu32, time); - screen.text(text_buf, minimal_font, Point(COL2, ROW1)); - - blit::debugf("Hello from 32blit time = %lu\n\r", time); - -} - -void update(uint32_t time) { - -} - - - diff --git a/examples/serial-debug/serial-debug.hpp b/examples/serial-debug/serial-debug.hpp deleted file mode 100644 index 8ca0a7e42..000000000 --- a/examples/serial-debug/serial-debug.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "32blit.hpp" diff --git a/examples/serial-debug/serial-debug.png b/examples/serial-debug/serial-debug.png deleted file mode 100644 index 6b0be2713..000000000 Binary files a/examples/serial-debug/serial-debug.png and /dev/null differ diff --git a/examples/shmup/CMakeLists.txt b/examples/shmup/CMakeLists.txt deleted file mode 100644 index c30573b9d..000000000 --- a/examples/shmup/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (shmup) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (shmup shmup.cpp) -blit_assets_yaml(shmup assets.yml) -blit_metadata(shmup metadata.yml) diff --git a/examples/shmup/assets.yml b/examples/shmup/assets.yml deleted file mode 100644 index 4e7958fac..000000000 --- a/examples/shmup/assets.yml +++ /dev/null @@ -1,7 +0,0 @@ -assets.hpp: - ../../assets/s4m_ur4i-space-shooter-backdrop.png: - name: sprites_background - palette: ../../assets/s4m_ur4i-space-shooter-backdrop-palette.png - - ../../assets/s4m_ur4i-space-shooter-ships.png: - name: sprites_ships \ No newline at end of file diff --git a/examples/shmup/metadata.yml b/examples/shmup/metadata.yml deleted file mode 100644 index 1455cb5d4..000000000 --- a/examples/shmup/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: SHMUP -description: A classic side scrolling shoot 'em up -author: pimoroni -splash: - file: shmup.png -icon: - file: shmup-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: game \ No newline at end of file diff --git a/examples/shmup/shmup-icon.png b/examples/shmup/shmup-icon.png deleted file mode 100644 index c77942c7a..000000000 Binary files a/examples/shmup/shmup-icon.png and /dev/null differ diff --git a/examples/shmup/shmup.cpp b/examples/shmup/shmup.cpp deleted file mode 100644 index f82b8569a..000000000 --- a/examples/shmup/shmup.cpp +++ /dev/null @@ -1,255 +0,0 @@ -#include "shmup.hpp" -#include "assets.hpp" - -using namespace blit; - -#define SCENERY_BIG_SKULL Rect(11, 3, 4, 3) -#define SCENERY_TUSK Rect(10, 3, 1, 3) -#define SCENERY_BIG_TUSK Rect(10, 6, 2, 3) -#define SCENERY_BIG_BONE Rect(12, 6, 3, 2) -#define SCENERY_CLAWS Rect(6, 5, 3, 2) -#define SCENERY_BIG_ROCK Rect(3, 5, 3, 3) - -#define SHOT_BIG_RED Rect(6, 0, 2, 1) -#define SHOT_LONG_RED Rect(6, 0, 4, 1) -#define SHOT_BIG_PINK Rect(10, 0, 2, 1) - -// These lookup tables include an offset in pixels -// as the first two uint8_t values. -// We offset in pixels rather than tiles to avoid having to -// multiply the values up when the sprite is drawn. -// The following values are bitmasks describing a sprite with -// a maximum of 8 tiles width, and unlimited height. -// Each bit, from left to right, indicates a tile starting from -// the offset that should be included in this sprite. -// This is much more space efficient than storing a point(x, y) -// for each tile we want in a sprite. - -// Weird ship with a hole in it -const std::vector BG_SHIP_1 = { \ - 12 * 8, 5 * 8, \ - 4, \ - 0b00100000, \ - 0b01110000, \ - 0b11110000 }; - -// Background ship with all the shuttle bays and little winglets on the bottom -const std::vector BG_SHIP_2{ \ - 9 * 8, 4 * 8, \ - 5, \ - 0b11111000, \ - 0b11111000, \ - 0b01110000 }; - -// Hog ship! -const std::vector HOG_SHIP{ \ - 10 * 8, 0, \ - 6, \ - 0b11111100, \ - 0b11111100, \ - 0b11111100, \ - 0b11111100 }; - -/* -Map - - [] --> [] --> [] --> [] - \ - [] --> [] --> [] - -Player - x, y - vx, vy - life -Enemy - x, y - hit - life -Projectile - x, y - vx, vy -Background Scenery - x, y - -*/ -bool hit = false; - -Pen hit_palette[2][5] = { - {}, - {} -}; - -Size boar_ship_size(32, 32); - -Surface* ships; -Surface* background; - -Tween tween_bob; -Tween tween_dusk_dawn; -Tween tween_parallax; - -void draw_tilebased_sprite(Surface* ss, Point origin, const std::vector ship, bool hflip = false) { - // We can use uint8_t everywhere here, but this limits us - // to a spritesheet of 256*256. That's fine! - uint8_t o_x = ship[0]; - uint8_t o_y = ship[1]; - - // We need to know the width of the ship within our bitmask - // so we can horizontally flip if needed without it going wonky - uint8_t w = ship[2]; - - for (auto i = 0; i < (uint8_t)ship.size() - 3; i++) { - uint8_t ship_mask = ship[i + 3]; // Bitmask for tiles in a horizontal row - uint8_t offset_y = (i * 8); - uint8_t src_y = o_y + offset_y; - for (auto j = 0; j < w; j++) { - uint8_t jj = j; - if (hflip) { - jj = w - 1 - jj; - } - if (ship_mask & (0b10000000 >> jj)) { - uint8_t offset_x = (jj * 8); - uint8_t src_x = o_x + offset_x; - screen.blit(ss, Rect(src_x, src_y, 8, 8), Point(origin.x + (j * 8), origin.y + offset_y), hflip ? SpriteTransform::HORIZONTAL : 0); - } - } - } -} - -void init() { - set_screen_mode(ScreenMode::hires); - - ships = Surface::load(sprites_ships); - background = Surface::load(sprites_background); - tween_bob.init(tween_sine, 0.0f, 1.0f, 2500, -1); - tween_bob.start(); - - tween_dusk_dawn.init(tween_sine, 0.0f, 1.0f, 500, 1); - tween_dusk_dawn.start(); - - tween_parallax.init(tween_linear, 0.0f, 1.0f, 10000, -1); - tween_parallax.start(); - screen.sprites = background; - - for (int x = 0; x < 5; x++) { - Pen s_c = screen.sprites->palette[4 + x]; - Pen c = Pen( - std::min(255, int(s_c.r * 1.8)), - std::min(255, int(s_c.g * 1.8)), - std::min(255, int(s_c.b * 1.8)) - ); - hit_palette[0][x] = s_c; - hit_palette[1][x] = c; - } - - for (int x = 0; x < 32; x++) { - background->palette[x] = desert[x]; - } -} - -void render(uint32_t time) { - uint32_t ms_start = blit::now() - time; - screen.pen = background->palette[21]; - screen.clear(); - screen.sprites = background; - - for (int x = 0; x < 40; x++) { - screen.sprite(Rect(15, 3, 1, 5), Point(x * 8, 0), 0); - screen.sprite(Rect(0, 1, 1, 8), Point(x * 8, screen.bounds.h - 64), 0); - } - - Pen t = background->palette[29]; - background->palette[29] = background->palette[20]; - - // Far mountains - screen.sprite(Rect(1, 2, 15, 1), Point((tween_parallax.value * 60), screen.bounds.h - 80), Point(0, 0), 2.0f, 0); - screen.sprite(Rect(5, 1, 2, 1), Point((tween_parallax.value * 60) + (8 * 4 * 2.0f), screen.bounds.h - 96), Point(0, 0), 2.0f, 0); - screen.sprite(Rect(12, 1, 3, 1), Point((tween_parallax.value * 60) + (8 * 11 * 2.0f), screen.bounds.h - 96), Point(0, 0), 2.0f, 0); - - // Try and palette swap in a transparent colour and draw in some reflections? - background->palette[29] = Pen(background->palette[19].r, background->palette[19].g, background->palette[19].b, 100); - screen.sprite(Rect(1, 2, 15, 1), Point((tween_parallax.value * 60), screen.bounds.h - 64), Point(0, 0), 2.0f, 2); - screen.sprite(Rect(5, 1, 2, 1), Point((tween_parallax.value * 60) + (8 * 4 * 2.0f), screen.bounds.h - 48), Point(0, 0), 2.0f, 2); - screen.sprite(Rect(12, 1, 3, 1), Point((tween_parallax.value * 60) + (8 * 11 * 2.0f), screen.bounds.h - 48), Point(0, 0), 2.0f, 2); - background->palette[29] = t; - - screen.sprite(Rect(2, 0, 2, 1), Point(0, screen.bounds.h - 72), 0); - screen.sprite(Rect(1, 2, 3, 1), Point(60, screen.bounds.h - 72), 0); - screen.sprite(Rect(2, 1, 2, 1), Point(120, screen.bounds.h - 72), 0); - - background->palette[29] = background->palette[18]; - screen.sprite(Rect(2, 0, 2, 1), Point(0, screen.bounds.h - 64), 2); - screen.sprite(Rect(1, 2, 3, 1), Point(60, screen.bounds.h - 64), 2); - screen.sprite(Rect(2, 1, 2, 1), Point(120, screen.bounds.h - 64), 2); - - background->palette[29] = t; - - screen.sprite(SCENERY_BIG_SKULL, Point(0, screen.bounds.h - 52), 0); - screen.sprite(SCENERY_CLAWS, Point(30, screen.bounds.h - 48), 0); - screen.sprite(SCENERY_BIG_TUSK, Point(70, screen.bounds.h - 32), 0); - screen.sprite(SCENERY_BIG_BONE, Point(120, screen.bounds.h - 64), 0); - screen.sprite(SCENERY_BIG_ROCK, Point(230, screen.bounds.h - 32), 0); - - screen.sprite(SHOT_BIG_RED, Point(30, 60), 0); - - // Draw a chessboard so we can count our sprite tiles - for (int x = 0; x < 128 / 8; x++) { - for (int y = 0; y < 128 / 8; y++) { - if ((y + x) & 1) { - screen.pen = Pen(0, 0, 0, 64); - } - else { - screen.pen = Pen(255, 255, 255, 64); - } - screen.rectangle(Rect(x * 8, y * 8, 8, 8)); - } - } - - // Draw the whole ship spritesheet - screen.blit(ships, Rect(0, 0, 128, 128), Point(0, 0)); - - draw_tilebased_sprite(ships, Point(170, 120 + 5.0f * tween_bob.value), BG_SHIP_1); - draw_tilebased_sprite(ships, Point(120, 120 + 10.0f * tween_bob.value), BG_SHIP_2); - draw_tilebased_sprite(ships, Point(200, 160 + 10.0f * tween_bob.value), HOG_SHIP); - draw_tilebased_sprite(ships, Point(60, 160 + 10.0f * tween_bob.value), HOG_SHIP, true); - - screen.alpha = 200; - for (auto x = 0; x < 10; x++) { - for (auto y = 0; y < 10; y++) { - draw_tilebased_sprite(ships, Point(x * 32, y * 24 + 5.0f * tween_bob.value), BG_SHIP_1, (x + y) & 1); - } - } - screen.alpha = 255; - - uint32_t ms_end = blit::now() - time; - - screen.pen = Pen(255, 100, 100); - screen.text(std::to_string(ms_end - ms_start), minimal_font, Point(5, 230)); -} - -void update(uint32_t time) { - if (buttons & Button::A && tween_dusk_dawn.is_finished()) { - tween_dusk_dawn.start(); - } - - for (int x = 0; x < 32; x++) { - Pen original = Pen( - sprites_background[x * 4 + 20], - sprites_background[x * 4 + 21], - sprites_background[x * 4 + 22], - sprites_background[x * 4 + 23] - ); - - Pen d = desert[x]; - - float s = 1.0f - tween_dusk_dawn.value; - float c = tween_dusk_dawn.value; - - background->palette[x] = Pen( - std::min(255, int((d.r * s) + (original.r * c))), - std::min(255, int((d.g * s) + (original.g * c))), - std::min(255, int((d.b * s) + (original.b * c))), - original.a - ); - } -} diff --git a/examples/shmup/shmup.hpp b/examples/shmup/shmup.hpp deleted file mode 100644 index 34f1d59bf..000000000 --- a/examples/shmup/shmup.hpp +++ /dev/null @@ -1,39 +0,0 @@ -#include "32blit.hpp" - -using namespace blit; - -const Pen desert[] = { - Pen(0, 0, 0, 0), - Pen(98, 26, 142), - Pen(174, 57, 172), - Pen(238, 141, 255), - Pen(245, 6, 189), - Pen(171, 21, 91), - Pen(235, 42, 103), - Pen(255, 225, 244), - Pen(244, 239, 152), - Pen(247, 136, 86), - Pen(179, 73, 91), - Pen(56, 18, 50), - Pen(229, 42, 50), - Pen(19, 46, 62), - Pen(116, 241, 235), - Pen(32, 67, 74), - Pen(181, 82, 68), - Pen(159, 103, 74), - Pen(125, 87, 61), - Pen(149, 106, 64), - Pen(187, 141, 81), - Pen(227, 171, 98), - Pen(227, 212, 98), - Pen(186, 187, 90), - Pen(110, 112, 63), - Pen(190, 193, 129), - Pen(211, 215, 178), - Pen(239, 220, 194), - Pen(238, 191, 129), - Pen(105, 75, 35), - Pen(126, 90, 43), - Pen(147, 106, 52) -}; - diff --git a/examples/shmup/shmup.png b/examples/shmup/shmup.png deleted file mode 100644 index 27217ffb3..000000000 Binary files a/examples/shmup/shmup.png and /dev/null differ diff --git a/examples/sprite-test/CMakeLists.txt b/examples/sprite-test/CMakeLists.txt deleted file mode 100644 index fbae00744..000000000 --- a/examples/sprite-test/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (sprite-test) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (sprite-test sprite-test.cpp) -blit_assets_yaml (sprite-test assets.yml) -blit_metadata (sprite-test metadata.yml) \ No newline at end of file diff --git a/examples/sprite-test/assets.yml b/examples/sprite-test/assets.yml deleted file mode 100644 index f0b7432db..000000000 --- a/examples/sprite-test/assets.yml +++ /dev/null @@ -1,3 +0,0 @@ -assets.cpp: - ../../assets/s4m_ur4i-dingbads.png: - name: asset_dingbads diff --git a/examples/sprite-test/metadata.yml b/examples/sprite-test/metadata.yml deleted file mode 100644 index be7b4eec2..000000000 --- a/examples/sprite-test/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Sprite Test -description: A simple sprite test. -author: pimoroni -splash: - file: ../no-image.png -icon: - file: ../no-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo \ No newline at end of file diff --git a/examples/sprite-test/sprite-test.cpp b/examples/sprite-test/sprite-test.cpp deleted file mode 100644 index 55d660410..000000000 --- a/examples/sprite-test/sprite-test.cpp +++ /dev/null @@ -1,122 +0,0 @@ -#include -#include -#include -#include - -#include "sprite-test.hpp" -#include "assets.hpp" - -using namespace blit; - -/* setup */ -void init() { - // You gotta load those tasty sprites first - // "asset_dingbads" is the asset name defined in assets.yml - screen.sprites = Surface::load(asset_dingbads); -} - -int tick_count = 0; -void render(uint32_t time_ms) { - screen.pen = Pen(20, 30, 40); - screen.clear(); - - screen.alpha = 255; - screen.mask = nullptr; - - // draw grid - screen.alpha = 255; - screen.pen = Pen(255, 255, 255); - screen.rectangle(Rect(0, 0, 320, 14)); - - // Left Titles - screen.text("Apple", minimal_font, Point(5, 20)); - screen.text("Skull", minimal_font, Point(5, 40)); - screen.text("Flowers", minimal_font, Point(5, 60)); - screen.text("Rotate", minimal_font, Point(5, 80)); - screen.text("Flip", minimal_font, Point(5, 100)); - - // Right Titles - screen.text("Big\n(Blit)", minimal_font, Point(85, 20)); - screen.text("Big\n(Sprite)", minimal_font, Point(85, 40)); - - screen.pen = Pen(0, 0, 0); - screen.text("Sprite demo", minimal_font, Point(5, 4)); - - uint32_t ms_start = now(); - - // Left Examples - - // Draw a sprite using its numerical index into the sprite sheet - // Treats the sprite sheet as a grid of 8x8 sprites numbered from 0 to 63 - // In this case sprite number 1 is the second sprite from the top row. - // It should be an apple! Munch! - screen.sprite(1, Point(50, 20)); - - // Draw a sprite using its X/Y position from the sprite sheet - // Treats the sprite sheet as a grid of 8x8 sprites - // numbered 0 to 15 across and 0 to 15 down! - // In this case we draw the sprite from: - // The 10th position across (0 based, remember!) - // The 3rd position down. - // It should be a skull! Yarr! - screen.sprite(Point(9, 2), Point(50, 40)); - - // Draw a group of sprites starting from an X/Y position, with a width/height - // Treats the sprite sheet a grid of 8x8 sprites and selects a group of them defined by a Rect(x, y, w, h) - // The width and height are measured in sprites. - // In this case we draw three sprites from the 6th column on the 12th row. - // It should be a row of flowers! Awww! - screen.sprite(Rect(5, 11, 3, 1), Point(50, 60)); - - // Draw a heart rotated 90, 180 and 270 degrees - screen.pen = Pen(40, 60, 80); - screen.rectangle(Rect(50, 80, 8, 8)); - screen.sprite(Point(0, 4), Point(50, 80), SpriteTransform::R90); - screen.rectangle(Rect(60, 80, 8, 8)); - screen.sprite(Point(0, 4), Point(60, 80), SpriteTransform::R180); - screen.rectangle(Rect(70, 80, 8, 8)); - screen.sprite(Point(0, 4), Point(70, 80), SpriteTransform::R270); - - // Draw a heart flipped horiontally and vertically - screen.rectangle(Rect(50, 100, 8, 8)); - screen.sprite(Point(0, 4), Point(50, 100), SpriteTransform::HORIZONTAL); - screen.rectangle(Rect(60, 100, 8, 8)); - screen.sprite(Point(0, 4), Point(60, 100), SpriteTransform::VERTICAL); - - // Right examples - - // Draw a cherry, stretched to 16x16 pixels - screen.stretch_blit( - screen.sprites, - Rect(0, 0, 8, 8), - Rect(130, 16, 16, 16) - ); - - // Also, stretched with the scale factor of the normal sprite functions - // The second Point() argument here is the origin for any transform applied, - // but here we aren't applying one. - screen.sprite(0, Point(130, 40), Point(0, 0), 2.0f); - - uint32_t ms_end = now(); - - - // draw FPS meter - screen.alpha = 255; - screen.pen = Pen(255, 255, 255, 100); - screen.rectangle(Rect(1, 120 - 10, 12, 9)); - screen.pen = Pen(255, 255, 255, 200); - std::string fms = std::to_string(ms_end - ms_start); - screen.text(fms, minimal_font, Rect(3, 120 - 9, 10, 16)); - - int block_size = 4; - for (uint32_t i = 0; i < (ms_end - ms_start); i++) { - screen.pen = Pen(i * 5, 255 - (i * 5), 0); - screen.rectangle(Rect(i * (block_size + 1) + 1 + 13, screen.bounds.h - block_size - 1, block_size, block_size)); - } - - screen.watermark(); -} - -void update(uint32_t time) { - -} diff --git a/examples/sprite-test/sprite-test.hpp b/examples/sprite-test/sprite-test.hpp deleted file mode 100644 index b791bb454..000000000 --- a/examples/sprite-test/sprite-test.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include - -#include "32blit.hpp" - -void init(); -void update(uint32_t time); -void render(uint32_t time); \ No newline at end of file diff --git a/examples/text/CMakeLists.txt b/examples/text/CMakeLists.txt deleted file mode 100644 index 7f5b2ecb8..000000000 --- a/examples/text/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (text) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (text text.cpp) -blit_assets_yaml (text assets.yml) -blit_metadata (text metadata.yml) diff --git a/examples/text/OFL.txt b/examples/text/OFL.txt deleted file mode 100644 index 70881e0c4..000000000 --- a/examples/text/OFL.txt +++ /dev/null @@ -1,93 +0,0 @@ -Copyright 2012 The Press Start 2P Project Authors (cody@zone38.net), with Reserved Font Name "Press Start 2P". - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/examples/text/PressStart2P-Regular.ttf b/examples/text/PressStart2P-Regular.ttf deleted file mode 100644 index e9b029c59..000000000 Binary files a/examples/text/PressStart2P-Regular.ttf and /dev/null differ diff --git a/examples/text/assets.yml b/examples/text/assets.yml deleted file mode 100644 index b3f057c2c..000000000 --- a/examples/text/assets.yml +++ /dev/null @@ -1,8 +0,0 @@ -# This file defines assets used by the example; the standard 32Blit -# pipeline will compile and link these assets into your code. - -font_asset.cpp: - PressStart2P-Regular.ttf: - name: press_start_font - height: 8 - diff --git a/examples/text/metadata.yml b/examples/text/metadata.yml deleted file mode 100644 index 7f8b08ebf..000000000 --- a/examples/text/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Text -description: A demo of text placement and alignment. -author: daft_freak -splash: - file: ../no-image.png -icon: - file: ../no-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo diff --git a/examples/text/text.cpp b/examples/text/text.cpp deleted file mode 100644 index 94532a812..000000000 --- a/examples/text/text.cpp +++ /dev/null @@ -1,127 +0,0 @@ -#include "text.hpp" -#include "font_asset.hpp" - -using namespace blit; - -bool variable_width = true; -TextAlign alignment = TextAlign::top_left; -const Font custom_font(press_start_font); - -std::string alignment_to_string(TextAlign alignment) { - switch (alignment) { - case TextAlign::bottom_left: - return "align: bottom_left"; - case TextAlign::bottom_right: - return "align: bottom_right"; - case TextAlign::top_left: - return "align: top_left"; - case TextAlign::top_right: - return "align: top_right"; - case TextAlign::center_center: - return "align: center_center"; - case TextAlign::center_left: - return "align: center_left"; - case TextAlign::center_right: - return "align: center_right"; - case TextAlign::top_center: - return "align: top_center"; - case TextAlign::bottom_center: - return "align: bottom_center"; - } - return ""; -} - -void init() { - set_screen_mode(ScreenMode::hires); -} - -void render(uint32_t time) { - screen.clip = Rect(Point(0, 0), screen.bounds); - screen.pen = Pen(0, 0, 0); - screen.clear(); - - screen.alpha = 255; - screen.pen = Pen(255, 255, 255); - screen.rectangle(Rect(0, 0, 320, 14)); - screen.pen = Pen(0, 0, 0); - screen.text("Text Rendering", minimal_font, Point(5, 4)); - - // alignment - Rect text_rect(20, 20, 120, 80); - - screen.pen = Pen(64, 64, 64); - screen.rectangle(text_rect); - - std::string text = "This is some aligned text!\nUse the dpad to change the alignment\nand A to toggle variable-width."; - text = screen.wrap_text(text, text_rect.w, minimal_font, variable_width); - - screen.pen = Pen(0xFF, 0xFF, 0xFF); - screen.text(text, minimal_font, text_rect, variable_width, alignment); - - screen.text(alignment_to_string(alignment), minimal_font, Point(80, 102), true, TextAlign::center_h); - - auto size = screen.measure_text(text, minimal_font, variable_width); - screen.text("bounds: " + std::to_string(size.w) + "x" + std::to_string(size.h), minimal_font, Point(80, 110), true, TextAlign::center_h); - - text_rect.x += 160; - - // clipping - Rect clip(text_rect.x + 30 + 30 * cosf(time / 1000.0f), text_rect.y, 60, 80); - screen.pen = Pen(64, 64, 64); - screen.rectangle(text_rect); - - text = "This text is clipped!\nIt's slightly hard to read since half of it is missing."; - text = screen.wrap_text(text, text_rect.w, minimal_font, variable_width); - - screen.pen = Pen(0xFF, 0xFF, 0xFF); - screen.clip = clip; - screen.text(text, minimal_font, text_rect, variable_width, TextAlign::center_center); - screen.clip = Rect(Point(0, 0), screen.bounds); // Reset the clip! - - // Using a custom font - text_rect.x -= 160; - text_rect.y += 120; - - screen.pen = Pen(64, 64, 64); - screen.rectangle(text_rect); - - text = "This text uses\nan imported\nTrueType font."; - text = screen.wrap_text(text, text_rect.w, minimal_font, variable_width); - - screen.pen = Pen(0xFF, 0xFF, 0xFF); - screen.text(text, custom_font, text_rect, variable_width, alignment); - - // Alignment around a Point rather than a Rect - Point text_point(240,180); - - screen.pen = Pen(64, 64, 64); - screen.line(text_point - Point(20,0), text_point + (Point(20,0))); - screen.line(text_point - Point(0,20), text_point + (Point(0,20))); - - text = "This text is\naligned to a\nPoint instead\nof a Rect."; - text = screen.wrap_text(text, text_rect.w, minimal_font, variable_width); - - screen.pen = Pen(0xFF, 0xFF, 0xFF); - screen.text(text, minimal_font, text_point, variable_width, alignment); -} - -void update(uint32_t time) { - if (buttons.released & Button::A) - variable_width = !variable_width; - - alignment = TextAlign::top_left; - - if (buttons & Button::DPAD_DOWN) { - alignment = (TextAlign)(alignment | TextAlign::bottom); - } - else if (!(buttons & Button::DPAD_UP)) { - alignment = (TextAlign)(alignment | TextAlign::center_v); - } - - if (buttons & Button::DPAD_RIGHT) { - alignment = (TextAlign)(alignment | TextAlign::right); - } - else if (!(buttons & Button::DPAD_LEFT)) { - alignment = (TextAlign)(alignment | TextAlign::center_h); - } -} diff --git a/examples/text/text.hpp b/examples/text/text.hpp deleted file mode 100644 index b791bb454..000000000 --- a/examples/text/text.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include - -#include "32blit.hpp" - -void init(); -void update(uint32_t time); -void render(uint32_t time); \ No newline at end of file diff --git a/examples/tilemap-test/CMakeLists.txt b/examples/tilemap-test/CMakeLists.txt deleted file mode 100644 index b23828237..000000000 --- a/examples/tilemap-test/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (tilemap-test) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (tilemap-test tilemap-test.cpp) -blit_assets_yaml (tilemap-test assets.yml) -blit_metadata (tilemap-test metadata.yml) \ No newline at end of file diff --git a/examples/tilemap-test/assets.yml b/examples/tilemap-test/assets.yml deleted file mode 100644 index 847fb2a65..000000000 --- a/examples/tilemap-test/assets.yml +++ /dev/null @@ -1,5 +0,0 @@ -assets.cpp: - ../../assets/s4m_ur4i-platformer.png: - name: asset_platformer - ../../assets/tilemap-test.tmx: - name: asset_tilemap diff --git a/examples/tilemap-test/metadata.yml b/examples/tilemap-test/metadata.yml deleted file mode 100644 index 012b9a43b..000000000 --- a/examples/tilemap-test/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Tilemap Test -description: A showcase of Tilemap transform functions -author: pimoroni -splash: - file: ../no-image.png -icon: - file: ../no-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo \ No newline at end of file diff --git a/examples/tilemap-test/tilemap-test.cpp b/examples/tilemap-test/tilemap-test.cpp deleted file mode 100644 index 168db7419..000000000 --- a/examples/tilemap-test/tilemap-test.cpp +++ /dev/null @@ -1,260 +0,0 @@ -#include -#include -#include -#include - -#include "tilemap-test.hpp" -#include "assets.hpp" - -using namespace blit; - -TileMap* environment; - -/* setup */ -void init() { - blit::set_screen_mode(ScreenMode::lores); - - screen.sprites = Surface::load(asset_platformer); - environment = new TileMap((uint8_t*)asset_tilemap, nullptr, Size(64, 64), screen.sprites); -} - - -float deg2rad(float a) { - return a * (pi / 180.0f); -} - -uint32_t current_time; - - -static Mat3 dream(uint8_t y) { - float progress = (sinf(current_time / 2000.0f) + 1.0f) * 0.6f; // two second animation - progress = progress > 1.0f ? 1.0f : progress; - - screen.alpha = progress * 255.0f; - float step = (current_time / 200.0f) + (y / 10.0f); - float x_offset = (sinf(step) * (cosf(step) * 50.0f)) * (1.0f - progress); - - Mat3 transform = Mat3::translation( - Vec2(256, 156) + // offset to middle of world - Vec2(x_offset, 0) + // apply dream effect wave - Vec2(-80, -60) // transform to centre of framebuffer - ); - - return transform; -}; - -static Mat3 rotozoom(uint8_t y) { - float progress = (sinf(current_time / 2000.0f) + 1.0f) / 2.0f; // two second animation - - float angle = (1.0f - progress) * 360.0f; - float scale = progress; - - Mat3 transform = Mat3::identity(); - transform *= Mat3::translation(Vec2(256, 156)); // offset to middle of world - transform *= Mat3::rotation(deg2rad(angle)); // apply rotation - transform *= Mat3::scale(Vec2(scale, scale)); // apply scaling - transform *= Mat3::translation(Vec2(-80, -60)); // transform to centre of framebuffer - - return transform; -}; - -static Mat3 zoom(uint8_t y) { - float progress = (sinf(current_time / 1000.0f) + 1.0f) / 2.0f; // two second animation - - float scale = progress; - - Mat3 transform = Mat3::identity(); - transform *= Mat3::translation(Vec2(256, 156)); // offset to middle of world - transform *= Mat3::scale(Vec2(scale, scale)); // apply zoom effect using scaling - transform *= Mat3::translation(Vec2(-80, -60)); // transform to centre of framebuffer - - return transform; -}; - - -static Mat3 perspective(uint8_t y) { - float progress = (sinf(current_time / 2000.0f) + 1.0f) / 2.0f; // two second animation - progress = progress > 1.0f ? 1.0f : progress; - - screen.alpha = y + (255 - 120); - float scale = (y + 1) / 30.0f; - - Mat3 transform = Mat3::identity(); - transform *= Mat3::translation(Vec2(156, 130 + progress * 80.0f)); // offset to middle of world - transform *= Mat3::scale(Vec2(1.0f / scale, 1.0f / scale)); // apply scaling- increases with y to give a depth effect - transform *= Mat3::translation(Vec2(-80, -60)); // transform to centre of framebuffer - - return transform; -}; - - -static Mat3 water(uint8_t y) { - float step = (current_time / 200.0f) + (y / 10.0f); - float x_offset = (sinf(step) + sinf(step / 3.0f) + sinf(step * 2.0f)) * 2.0f; - - Mat3 transform = Mat3::translation( - Vec2(156, 130) + // offset to middle of world - Vec2(x_offset, 0) + // apply a water ripple effect - Vec2(-80, -60) // transform to centre of framebuffer - ); - - return transform; -}; - -static Mat3 warp(uint8_t y) { - float step = (current_time / 1000.0f) + (y / 100.0f); - float x_offset = (sinf(step) * (cosf(step) * 50.0f)); - - float angle = sinf(current_time / 500.0f) * 50.0f; - - Mat3 transform = Mat3::identity(); - transform *= Mat3::translation(Vec2(140, 140)); // offset to middle of world - transform *= Mat3::translation(Vec2(x_offset, 0)); // apply dream effect wave - transform *= Mat3::rotation(deg2rad(angle)); // apply dream effect wave - transform *= Mat3::translation(Vec2(-80, -60)); // transform to centre of framebuffer - - return transform; -}; - -static Mat3 ripple(uint8_t y) { - float step = (current_time / 250.0f) + (y / 25.0f); - - float scale = (sinf(step) / 4.0f) + 1.0f; - - Mat3 transform = Mat3::identity(); - transform *= Mat3::translation(Vec2(256, 156)); // offset to middle of world - transform *= Mat3::scale(Vec2(scale, scale)); // apply dream effect wave - transform *= Mat3::translation(Vec2(-80, -60)); // transform to centre of framebuffer - - return transform; -}; - -static Mat3 betamax(uint8_t y) { - float step = (current_time / 250.0f) + (y / 25.0f); - Point shake(0, 0); - - int8_t scale = int8_t((sinf(step) + 1.0f) * 5); - if (scale > 0) { - shake = Point((blit::random() % scale) - scale / 2, (blit::random() % scale) - scale / 2); - } - - Mat3 transform = Mat3::translation( - Vec2(256, 156) + // offset to middle of world - Vec2(shake) + // apply shake - Vec2(-80, -60) // transform to centre of framebuffer - ); - - return transform; -}; - -static Mat3 shake(uint8_t y) { - static uint32_t last_time = 0; - static Point shake(0, 0); - - if (current_time != last_time) { - last_time = current_time; - - uint8_t clamp = 20; - shake = Point(blit::random() % clamp, blit::random() % clamp); - float scale = sinf(current_time / 300.0f); - - scale = scale < 0.0f ? 0.0f : scale; - shake *= scale; - } - - Mat3 transform = Mat3::translation( - Vec2(256, 156) + // offset to middle of world - Vec2(shake) + // apply shake - Vec2(-80, -60) // transform to centre of framebuffer - ); - - return transform; -}; - -const std::function effect_callbacks[]{ - zoom, - dream, - ripple, - rotozoom, - warp, - perspective, - water, - betamax, - shake -}; - -const std::array effect_names{ - "zoom", - "dream", - "ripple", - "rotozoom", - "warp", - "perspective", - "water", - "betamax", - "shake" -}; - -uint8_t effect = 0; - -void render(uint32_t time_ms) { - current_time = time_ms; - - screen.alpha = 255; - screen.pen = Pen(39, 39, 54); - screen.clear(); - - screen.alpha = 255; - screen.mask = nullptr; - - //uint32_t ms_start = now(); - - environment->draw(&screen, Rect(0, 0, 160, 120), effect_callbacks[effect]); - - - screen.alpha = 255; - for (auto i = 0u; i < effect_names.size(); i++) { - if (effect == i) - screen.pen = Pen(255, 255, 255); - else - screen.pen = Pen(255, 255, 255, 100); - - screen.text(effect_names[i], minimal_font, Rect(5, 19 + (i * 10), 100, 10)); - } - - //uint32_t ms_end = now(); - - /* - // draw FPS meter - screen.alpha = 255; - screen.pen = Pen(0, 0, 0); - screen.rectangle(Rect(1, 120 - 10, 12, 9)); - screen.pen = Pen(255, 255, 255, 200); - std::string fms = std::to_string(ms_end - ms_start); - screen.text(fms, minimal_font, Rect(3, 120 - 9, 10, 16)); - - int block_size = 4; - for (int i = 0; i < (ms_end - ms_start); i++) { - screen.pen = Pen(i * 5, 255 - (i * 5), 0); - screen.rectangle(Rect(i * (block_size + 1) + 1 + 13, screen.bounds.h - block_size - 1, block_size, block_size)); - } - */ - - screen.pen = Pen(255, 255, 255); - screen.rectangle(Rect(0, 0, 320, 14)); - - screen.pen = Pen(0, 0, 0); - screen.text("Tilemap demo", minimal_font, Point(5, 4)); - screen.watermark(); -} - -void update(uint32_t time) { - auto last_effect = uint8_t(effect_names.size() - 1); - - if (buttons.pressed & Button::DPAD_DOWN) { - effect = effect == last_effect ? 0 : effect + 1; - } - if (buttons.pressed & Button::DPAD_UP) { - effect = effect == 0 ? last_effect : effect - 1; - } -} diff --git a/examples/tilemap-test/tilemap-test.hpp b/examples/tilemap-test/tilemap-test.hpp deleted file mode 100644 index b791bb454..000000000 --- a/examples/tilemap-test/tilemap-test.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include - -#include "32blit.hpp" - -void init(); -void update(uint32_t time); -void render(uint32_t time); \ No newline at end of file diff --git a/examples/tilt/CMakeLists.txt b/examples/tilt/CMakeLists.txt deleted file mode 100644 index 22268f5ec..000000000 --- a/examples/tilt/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (tilt) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) - -if(32BLIT_PICO) - # No accelerometer - return() -endif() - -blit_executable (tilt tilt.cpp) -blit_metadata (tilt metadata.yml) diff --git a/examples/tilt/metadata.yml b/examples/tilt/metadata.yml deleted file mode 100644 index 71ed88560..000000000 --- a/examples/tilt/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Tilt -description: A simple accelerometer demo, tilt to play with the sand grains. -author: pimoroni -splash: - file: tilt.png -icon: - file: tilt-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo diff --git a/examples/tilt/tilt-icon.png b/examples/tilt/tilt-icon.png deleted file mode 100644 index 5ccd96466..000000000 Binary files a/examples/tilt/tilt-icon.png and /dev/null differ diff --git a/examples/tilt/tilt.cpp b/examples/tilt/tilt.cpp deleted file mode 100644 index 5e6b9b1d0..000000000 --- a/examples/tilt/tilt.cpp +++ /dev/null @@ -1,198 +0,0 @@ -#include -#include -#include -#include - -#include "tilt.hpp" - -using namespace blit; - -#define GRAIN_COUNT 5000 - - -uint8_t grain_mask[160 * 120]; - -bool is_occupied(const Point &p) { - return grain_mask[p.x + (p.y * 160)] != 0; -} - -void set_occupied(const Point &p) { - grain_mask[p.x + (p.y * 160)] = 1; -} - -void clear_occupied(const Point &p) { - grain_mask[p.x + (p.y * 160)] = 0; -} - -float deg2rad(float a) { - return a * (pi / 180.0f); -} - -Vec2 gravity(0, 1000.0f); - -Pen colours[] = { - Pen(7, 254, 9), - Pen(230, 194, 41), - Pen(239, 45, 86), - Pen(241, 113, 5), - Pen(26, 143, 227), - Pen(201, 26, 227), -}; - -struct grain { - bool test_move(const Point &tp) { - if (screen.bounds.contains(tp)) { - if ( (tp.x == (int)p.x && tp.y == (int)p.y) || - !is_occupied(tp) ) { - return true; - } - } - - return false; - } - - bool update(const float td) { - v += (gravity * td); - if (v.length() > 50.0f) { - v.normalize(); - v *= 50.0f; - } - - // test point is along the velocity vector - Vec2 np = p; - Vec2 tp = p + (v * td); - bool found = false; - if ((found = test_move(tp))) { - np = tp; - } else { - // optimised -45 degree rotations - float rx = v.x * 0.70710f - v.y * -0.70710f; - float ry = v.x * -0.70710f + v.y * 0.70710f; - v.x = rx; - v.y = ry; - - tp = p + (v * td); - - if ((found = test_move(tp))) { - np = tp; - } - else { - // optimised 90 degree rotations - float rx = -v.y; - float ry = v.x; - v.x = rx; - v.y = ry; - - tp = p + (v * td); - - if ((found = test_move(tp))) { - np = tp; - } - } - } - - // update the position of our grain - if (found) { - clear_occupied(p); - p = np; - set_occupied(np); - } - else { - v = Vec2(0, 0); - } - - return true; - } - -public: - Vec2 p = Vec2(0, 0); - Vec2 v = Vec2(0, 1); - uint8_t c = 0; -}; - -grain grains[GRAIN_COUNT]; - - -/* setup */ -void init() { - for (auto &g : grains) { - do { - g.p = Vec2(Vec2(rand() % 160, rand() % 120)); - g.c = rand() % 6; - } while (is_occupied(g.p)); - } -} - -uint32_t update_time_ms = 0; - -void render(uint32_t time_ms) { - - screen.pen = Pen(0, 0, 0, 255); - screen.clear(); - - for (auto &g : grains) { - screen.pen = colours[g.c]; - screen.pixel(g.p); - } - - screen.pen = Pen(255, 255, 255); - Point centre = Point(80, 60); - screen.line(centre, centre + (gravity * 20.0f)); - - screen.watermark(); - - - // draw FPS meter - screen.alpha = 255; - screen.pen = Pen(0, 0, 0); - screen.rectangle(Rect(1, 120 - 10, 12, 9)); - screen.pen = Pen(255, 255, 255, 200); - std::string fms = std::to_string(update_time_ms); - screen.text(fms, minimal_font, Rect(3, 120 - 9, 10, 16)); - - int block_size = 4; - for (uint32_t i = 0; i < update_time_ms; i++) { - screen.pen = Pen(i * 5, 255 - (i * 5), 0); - screen.rectangle(Rect(i * (block_size + 1) + 1 + 13, screen.bounds.h - block_size - 1, block_size, block_size)); - } -} - - -void update(uint32_t time_ms) { - static uint32_t last_time_ms = time_ms; - - // smoke_generator.update(time_ms); - - /* - if (pressed(button::DPAD_LEFT)) { - gravity.rotate(0.01f); - } - - if (pressed(button::DPAD_RIGHT)) { - gravity.rotate(-0.01f); - } - - if (pressed(button::DPAD_UP)) { - gravity *= 1.01f; - } - - if (pressed(button::DPAD_DOWN)) { - gravity /= 1.01f; - } - */ - - gravity.x = blit::tilt.x; - gravity.y = blit::tilt.y; - gravity *= 1000.0f; - - float td = (time_ms - last_time_ms) / 1000.0f; - - uint32_t ms_start = now(); - for (auto &g : grains) { - g.update(td); - } - uint32_t ms_end = now(); - update_time_ms = ms_end - ms_start; - - last_time_ms = time_ms; -} \ No newline at end of file diff --git a/examples/tilt/tilt.hpp b/examples/tilt/tilt.hpp deleted file mode 100644 index b791bb454..000000000 --- a/examples/tilt/tilt.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include - -#include "32blit.hpp" - -void init(); -void update(uint32_t time); -void render(uint32_t time); \ No newline at end of file diff --git a/examples/tilt/tilt.png b/examples/tilt/tilt.png deleted file mode 100644 index 057ea1c01..000000000 Binary files a/examples/tilt/tilt.png and /dev/null differ diff --git a/examples/timer-test/CMakeLists.txt b/examples/timer-test/CMakeLists.txt deleted file mode 100644 index 18948fd8c..000000000 --- a/examples/timer-test/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (timer-test) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (timer-test timer-test.cpp) -blit_metadata (timer-test metadata.yml) \ No newline at end of file diff --git a/examples/timer-test/metadata.yml b/examples/timer-test/metadata.yml deleted file mode 100644 index 76ef20e0b..000000000 --- a/examples/timer-test/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Timer Test -description: A simple demo of timers. -author: pimoroni -splash: - file: ../no-image.png -icon: - file: ../no-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo \ No newline at end of file diff --git a/examples/timer-test/timer-test.cpp b/examples/timer-test/timer-test.cpp deleted file mode 100644 index 0650a3d21..000000000 --- a/examples/timer-test/timer-test.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include -#include -#include -#include - -#include "timer-test.hpp" - -/* -TODO: This example is really dry, how can we make it awesome? -Without making it so complicated that it fails to elucidate its point. -*/ - -using namespace blit; - -blit::Timer timer_count; -uint32_t count; - -void timer_count_update(blit::Timer &t){ - count++; - // Instead of using loops we're going to stop the timer in our callback - // In this case it will count to ten and then stop. - // But you could depend upon any condition to stop the timer. - if(count == 10) { - t.stop(); - } -} - -void init() { - blit::set_screen_mode(blit::ScreenMode::hires); - - // Timers must be initialized - // In this case we want our timer to call the `timer_count_update` function - // very 1000ms, or 1 second. We also want it to loop indefinitely. - // We can pass -1 to loop indefinitely, or just nothing at all since -1 - // is the default. - timer_count.init(timer_count_update, 1000, -1); - - // Next we probably want to start our timer! - timer_count.start(); -} - -int tick_count = 0; -void render(uint32_t time_ms) { - screen.pen = Pen(20, 30, 40); - screen.clear(); - - // Fancy title bar, nothing to see here. - screen.pen = Pen(255, 255, 255); - screen.rectangle(Rect(0, 0, 320, 14)); - screen.pen = Pen(0, 0, 0); - screen.text("Timer Test", minimal_font, Point(5, 4)); - - // Since our timer callback is updating our `count` variable - // we can just display it on the screen and watch it tick up! - screen.pen = Pen(255, 255, 255); - screen.text("Count: " + std::to_string(count), minimal_font, Point(120, 100)); - - // `is_running()` is a handy shorthand for checking the timer state - if(timer_count.is_running()) { - screen.text("Timer running...", minimal_font, Point(120, 110)); - } else { - screen.text("Timer stopped!", minimal_font, Point(120, 110)); - screen.text("Press A to restart.", minimal_font, Point(120, 120)); - } -} - -void update(uint32_t time_ms) { - // `is_stopped()` works too! - if (blit::buttons & blit::Button::A && timer_count.is_stopped()) { - count = 0; - timer_count.start(); - } -} diff --git a/examples/timer-test/timer-test.hpp b/examples/timer-test/timer-test.hpp deleted file mode 100644 index 226a98b82..000000000 --- a/examples/timer-test/timer-test.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include - -#include "32blit.hpp" - -void init(); -void update(uint32_t time); -void render(uint32_t time); \ No newline at end of file diff --git a/examples/tunnel/CMakeLists.txt b/examples/tunnel/CMakeLists.txt deleted file mode 100644 index e8256a696..000000000 --- a/examples/tunnel/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (tunnel) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (tunnel tunnel.cpp) -blit_assets_yaml(tunnel assets.yml) -blit_metadata (tunnel metadata.yml) \ No newline at end of file diff --git a/examples/tunnel/assets.yml b/examples/tunnel/assets.yml deleted file mode 100644 index 2431bb797..000000000 --- a/examples/tunnel/assets.yml +++ /dev/null @@ -1,6 +0,0 @@ -assets.hpp: - assets/tunnel.png: - name: packed_data - - assets/ship.png: - name: packed_data_ship \ No newline at end of file diff --git a/examples/tunnel/assets/ship.png b/examples/tunnel/assets/ship.png deleted file mode 100644 index 5002a4697..000000000 Binary files a/examples/tunnel/assets/ship.png and /dev/null differ diff --git a/examples/tunnel/assets/tunnel.png b/examples/tunnel/assets/tunnel.png deleted file mode 100644 index ef1bff9e4..000000000 Binary files a/examples/tunnel/assets/tunnel.png and /dev/null differ diff --git a/examples/tunnel/metadata.yml b/examples/tunnel/metadata.yml deleted file mode 100644 index 70f0138ae..000000000 --- a/examples/tunnel/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Tunnel -description: A basic side-scrolling tunnel projection. -author: pimoroni -splash: - file: tunnel.png -icon: - file: tunnel-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo \ No newline at end of file diff --git a/examples/tunnel/tunnel.cpp b/examples/tunnel/tunnel.cpp deleted file mode 100644 index 7f13c516d..000000000 --- a/examples/tunnel/tunnel.cpp +++ /dev/null @@ -1,282 +0,0 @@ - -#include -#include -#include -#include - -#include "tunnel.hpp" -#include "assets.hpp" - -using namespace blit; - -Surface *ss_ship = Surface::load(packed_data_ship); - -/* setup */ -void init() { - screen.alpha = 255; - screen.mask = nullptr; - screen.pen = Pen(0, 0, 0, 0); - screen.clear(); - - screen.sprites = Surface::load(packed_data); -} - -void tunnel_test(uint32_t time_ms) { - Point mipmap_offset[5] = { - Point(0, 0), - Point(128, 0), - Point(128, 64), - Point(128, 96), - Point(128, 112) - }; - uint8_t mipmap_size[5] = { - 128, - 64, - 32, - 16, - 8 - }; - - float x = time_ms / 1000.0; - - float y = 1.0; - - for (int scanline = 0; scanline < screen.bounds.w; scanline++) { - - float z = 3.0; // Distance from our imaginary wall plane - z += sinf((time_ms + scanline) / 1000.0f); - y = sinf((time_ms + scanline) / 200.0f); - - int wall_height = screen.bounds.h / z; - int wall_offset_top = (screen.bounds.h - wall_height) / 2; - float wall_offset = y * (wall_height / 4.0f); - - wall_offset_top -= wall_offset; - - int mipmap_index = 0; - if (wall_height <= 8) { - mipmap_index = 4; - } - if (wall_height <= 16) { - mipmap_index = 3; - } - if (wall_height <= 32) { - mipmap_index = 2; - } - if (wall_height <= 64) { - mipmap_index = 1; - } - - Point texture_origin = mipmap_offset[mipmap_index]; - uint8_t texture_size = mipmap_size[mipmap_index]; - - for (int wall_y = 0; wall_y < wall_height; wall_y++) { - Vec2 uv( - (float(scanline) / wall_height) + x, - (float(wall_y) / wall_height) - ); - - uv.x -= floorf(uv.x); - uv.y -= floorf(uv.y); - - - uint8_t *fragment_c = screen.sprites->ptr(Point( - texture_origin.x + (uv.x * texture_size), - texture_origin.y + (uv.y * texture_size) - )); - - screen.pen = screen.sprites->palette[*fragment_c]; - screen.alpha = 255; - screen.pixel(Point( - scanline, - wall_offset_top + wall_y - )); - } - - for (int ceil_y = 0; ceil_y < wall_offset_top; ceil_y++) { - - float distance = (float)screen.bounds.h / (2.0f * (screen.bounds.h - ceil_y - wall_offset) - screen.bounds.h); - float weight = distance / z; - - float t_size = float(screen.bounds.h) / distance; - - int mipmap_index = 0; - if (t_size <= 8) { - mipmap_index = 4; - } - if (t_size <= 16) { - mipmap_index = 3; - } - if (t_size <= 32) { - mipmap_index = 2; - } - if (t_size <= 64) { - mipmap_index = 1; - } - - Point texture_origin = mipmap_offset[mipmap_index]; - uint8_t texture_size = mipmap_size[mipmap_index]; - - - Vec2 uv( - (float(scanline) / wall_height) + x, - 0.5 - ); - - uv.x = uv.x * weight; - uv.x += x * (1.0f - weight); - - uv.y = uv.y * weight; - uv.y += z * (1.0f - weight); - - uv.x -= floorf(uv.x); - uv.y -= floorf(uv.y); - - uint8_t *fragment_c = screen.sprites->ptr(Point( - texture_origin.x + (uv.x * texture_size), - texture_origin.y + (uv.y * texture_size) - )); - - screen.pen = screen.sprites->palette[*fragment_c]; - screen.alpha = 200; - screen.pixel(Point(scanline, ceil_y)); - } - - for (int floor_y = wall_offset_top + wall_height; floor_y < screen.bounds.h; floor_y++) { - - float distance = (float)screen.bounds.h / (2.0f * (floor_y + wall_offset) - screen.bounds.h); - float weight = distance / z; - - float t_size = float(screen.bounds.h) / distance; - - int mipmap_index = 0; - if (t_size <= 8) { - mipmap_index = 4; - } - if (t_size <= 16) { - mipmap_index = 3; - } - if (t_size <= 32) { - mipmap_index = 2; - } - if (t_size <= 64) { - mipmap_index = 1; - } - - Point texture_origin = mipmap_offset[mipmap_index]; - uint8_t texture_size = mipmap_size[mipmap_index]; - - - Vec2 uv( - (float(scanline) / wall_height) + x, - 0.1f - ); - - uv.x = uv.x * weight; - uv.x += x * (1.0f - weight); - - uv.y = uv.y * weight; - uv.y += z * (1.0f - weight); - - uv.x -= floorf(uv.x); - uv.y -= floorf(uv.y); - - uint8_t *fragment_c = screen.sprites->ptr(Point( - texture_origin.x + (uv.x * texture_size), - texture_origin.y + (uv.y * texture_size) - )); - - screen.pen = screen.sprites->palette[*fragment_c]; - screen.alpha = 200; - screen.pixel(Point(scanline, floor_y)); - - } - } - -} - -void tunnel_test1(uint8_t time_ms) { - - int max_stripe_height = (screen.bounds.h / 3); - int min_stripe_height = 40; - - for (int scanline = 0; scanline < screen.bounds.w; scanline++) { - screen.alpha = 255; - int offset = scanline * 2; - //float time_offset = (time_ms + offset) / 100.0f; - float x = (sinf(float(time_ms + offset) / 1000.0f) + 1.0f) / 2.0f; - float y = (sinf(float(time_ms + offset + 1000) / 2000.0f) + 1.0f) / 2.0f; - - float stripe_height = min_stripe_height + max_stripe_height * y; - float stripe_offset_top = (screen.bounds.h / 4) * x; - - float t_scale = float(min_stripe_height + max_stripe_height) / stripe_height; - - /*screen.pen = rgba(255, 200, 200); - screen.line( - point(scanline, stripe_offset_top), - point(scanline, stripe_offset_top + stripe_height) - );*/ - - Vec2 c(((scanline * t_scale) + (time_ms / 5.0f)), 0); - - screen.stretch_blit_vspan(screen.sprites, Point(int(c.x) % 128, int(c.y) % 128), 128, Point(scanline, stripe_offset_top), stripe_height); - - - for (int f = 0; f < screen.bounds.h - stripe_height - stripe_offset_top - 1; f++) { - float distance = (float)(screen.bounds.h - stripe_height - stripe_offset_top - 1) / f; - - c.y = distance * stripe_height; - /*while (c.y < 0) { - c.y = 127 - c.y; - } - while (c.y > 127) { - c.y -= 127; - }*/ - - c.x -= (scanline - (screen.bounds.w / 2)) / 200.0f; - /*while (c.x < 0) { - c.x = 127 - c.x; - } - while (c.x > 127) { - c.x -= 127; - }*/ - - - uint8_t *fragment_c = screen.sprites->ptr(int(c.x) % 128, int(c.y) % 128); - - screen.pen = screen.sprites->palette[*fragment_c]; - screen.alpha = 200; - screen.pixel(Point(scanline, (stripe_offset_top + stripe_height) + f - 1)); - } - } - -} - -void render(uint32_t time_ms) { - uint32_t ms_start = now(); - - screen.pen = Pen(0, 0, 0, 255); - screen.clear(); - - tunnel_test(time_ms); - - screen.alpha = 255; - - int x = 20 + (sinf(time_ms / 1000.0f) * 10.0f); - int y = 40 + (sinf(time_ms / 1500.0f) * 30.0f); - - screen.blit(ss_ship, Rect(0, 0, 64, 32), Point(x, y)); - - uint32_t ms_end = now(); - screen.mask = nullptr; - screen.pen = Pen(255, 0, 0); - for (uint32_t i = 0; i < (ms_end - ms_start); i++) { - screen.pen = Pen(i * 5, 255 - (i * 5), 0); - screen.rectangle(Rect(i * 3 + 1, screen.bounds.h - 3, 2, 2)); - } -} - -void update(uint32_t time) { - -} diff --git a/examples/tunnel/tunnel.hpp b/examples/tunnel/tunnel.hpp deleted file mode 100644 index 5be1b3e4a..000000000 --- a/examples/tunnel/tunnel.hpp +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -#include - -#include "32blit.hpp" - - -void init(); -void update(uint32_t time); -void render(uint32_t time); diff --git a/examples/tunnel/tunnel.png b/examples/tunnel/tunnel.png deleted file mode 100644 index dfd67e82d..000000000 Binary files a/examples/tunnel/tunnel.png and /dev/null differ diff --git a/examples/tween-demo/CMakeLists.txt b/examples/tween-demo/CMakeLists.txt deleted file mode 100644 index 463d66811..000000000 --- a/examples/tween-demo/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (tween-demo) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (tween-demo tween-demo.cpp) -blit_metadata (tween-demo metadata.yml) diff --git a/examples/tween-demo/metadata.yml b/examples/tween-demo/metadata.yml deleted file mode 100644 index 3b147a658..000000000 --- a/examples/tween-demo/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Tween Demo -description: A simple demo of tween functions. -author: daft_freak -splash: - file: ../no-image.png -icon: - file: ../no-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo diff --git a/examples/tween-demo/tween-demo.cpp b/examples/tween-demo/tween-demo.cpp deleted file mode 100644 index d251e720a..000000000 --- a/examples/tween-demo/tween-demo.cpp +++ /dev/null @@ -1,81 +0,0 @@ -#include - -#include "tween-demo.hpp" - -using namespace blit; - -Tween tween; - -struct TweenInfo { - Tween::TweenFunction func; - const char *name; -}; - -static const int num_tween_funcs = 5; -TweenInfo tween_funcs[num_tween_funcs]{ - {tween_linear, "Linear"}, - {tween_ease_in_quad, "Ease in quad"}, - {tween_ease_out_quad, "Ease out quad"}, - {tween_ease_in_out_quad, "Ease in out quad"}, - {tween_sine, "Sine"}, -}; - -int current_tween_func = 0; - -void init() { - set_screen_mode(ScreenMode::hires); - - tween.init(tween_linear, 0.0f, 200.0f, 5000, -1); - tween.start(); -} - -void render(uint32_t time_ms) { - screen.pen = Pen(20, 30, 40); - screen.clear(); - - screen.pen = Pen(255, 255, 255); - screen.rectangle(Rect(0, 0, 320, 14)); - - screen.pen = Pen(0, 0, 0); - screen.text(std::string("Tween demo - ") + tween_funcs[current_tween_func].name, minimal_font, Point(5, 4)); - - screen.pen = Pen(255, 255, 255); - screen.circle(Point(310, 24 + tween.value), 5); - - // graph curve - const int graph_y = 24, graph_w = 280, graph_h = 200; - int prev_y = tween.function(0, 0, graph_h, 200); - - for(int x = 1; x < graph_w; x++) { - int y = tween.function(x, 0, graph_h, graph_w); - - screen.line(Point(x + 20 - 1, prev_y + graph_y), Point(x + 20, y + graph_y)); - prev_y = y; - } - - screen.pen = Pen(127, 127, 127); - - screen.h_span(Point(20, graph_y + graph_h), graph_w); - screen.v_span(Point(20, graph_y), graph_h); -} - -void update(uint32_t time_ms) { - if(buttons.released & Button::DPAD_LEFT) { - current_tween_func = current_tween_func == 0 ? num_tween_funcs - 1 : current_tween_func - 1; - - tween.function = tween_funcs[current_tween_func].func; - tween.start(); - } else if(buttons.released & Button::DPAD_RIGHT) { - current_tween_func = current_tween_func + 1 == num_tween_funcs ? 0 : current_tween_func + 1; - - tween.function = tween_funcs[current_tween_func].func; - tween.start(); - } - - if(buttons.released & Button::A) { - if(tween.is_paused()) - tween.start(); - else - tween.pause(); - } -} diff --git a/examples/tween-demo/tween-demo.hpp b/examples/tween-demo/tween-demo.hpp deleted file mode 100644 index 226a98b82..000000000 --- a/examples/tween-demo/tween-demo.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include - -#include "32blit.hpp" - -void init(); -void update(uint32_t time); -void render(uint32_t time); \ No newline at end of file diff --git a/examples/tween-test/CMakeLists.txt b/examples/tween-test/CMakeLists.txt deleted file mode 100644 index deb73d019..000000000 --- a/examples/tween-test/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (tween-test) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (tween-test tween-test.cpp) -blit_metadata (tween-test metadata.yml) diff --git a/examples/tween-test/metadata.yml b/examples/tween-test/metadata.yml deleted file mode 100644 index 9de677076..000000000 --- a/examples/tween-test/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Tween Test -description: A simple test of tween functions. -author: pimoroni -splash: - file: ../no-image.png -icon: - file: ../no-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo \ No newline at end of file diff --git a/examples/tween-test/tween-test.cpp b/examples/tween-test/tween-test.cpp deleted file mode 100644 index c84e15f51..000000000 --- a/examples/tween-test/tween-test.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include -#include -#include -#include - -#include "tween-test.hpp" -#include "graphics/color.hpp" - -using namespace blit; - -blit::Tween tween_bounce; -blit::Tween tween_colour; - -void init() { - blit::set_screen_mode(blit::ScreenMode::hires); - - tween_bounce.init(tween_sine, 200.0f, 0.0f, 5000, -1); - tween_bounce.start(); - - tween_colour.init(tween_sine, 0.0f, 1.0f, 10000, -1); - tween_colour.start(); -} - -int tick_count = 0; -void render(uint32_t time_ms) { - screen.pen = Pen(20, 30, 40); - screen.clear(); - - screen.pen = blit::hsv_to_rgba(tween_colour.value, 1.0f, 1.0f); - screen.circle(Point(160, 20+tween_bounce.value), 20); - - screen.pen = Pen(255, 255, 255); - screen.text("Value: " + std::to_string(tween_bounce.value), minimal_font, Point(175, 35+tween_bounce.value)); -} - -void update(uint32_t time_ms) { -} diff --git a/examples/tween-test/tween-test.hpp b/examples/tween-test/tween-test.hpp deleted file mode 100644 index 226a98b82..000000000 --- a/examples/tween-test/tween-test.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include - -#include "32blit.hpp" - -void init(); -void update(uint32_t time); -void render(uint32_t time); \ No newline at end of file diff --git a/examples/voxel/CMakeLists.txt b/examples/voxel/CMakeLists.txt deleted file mode 100644 index d102df51c..000000000 --- a/examples/voxel/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (voxel) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) - -if(32BLIT_PICO) - # This example uses too much RAM and flash - return() -endif() - -blit_executable (voxel voxel.cpp) -blit_assets_yaml(voxel assets.yml) -blit_metadata (voxel metadata.yml) diff --git a/examples/voxel/assets.yml b/examples/voxel/assets.yml deleted file mode 100644 index 19433595a..000000000 --- a/examples/voxel/assets.yml +++ /dev/null @@ -1,4 +0,0 @@ -assets.cpp: - assets/demo.map: - name: demo_map - type: raw/binary diff --git a/examples/voxel/assets/demo.map b/examples/voxel/assets/demo.map deleted file mode 100644 index 7f94ee062..000000000 Binary files a/examples/voxel/assets/demo.map and /dev/null differ diff --git a/examples/voxel/metadata.yml b/examples/voxel/metadata.yml deleted file mode 100644 index 39457c82c..000000000 --- a/examples/voxel/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Voxel -description: A pseudo 3D voxel terrain engine fashioned after retro flight simulators. -author: pimoroni -splash: - file: voxel.png -icon: - file: voxel-icon.png -version: v1.0.0 -url: https://github.com/32blit/32blit-sdk -category: demo \ No newline at end of file diff --git a/examples/voxel/process-maps.py b/examples/voxel/process-maps.py deleted file mode 100644 index 1c15f1c35..000000000 --- a/examples/voxel/process-maps.py +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env python3 - -# processes a colour map and a height map into the format needed -# for the voxel demo to stream map data on the fly from the -# SD card. -# -# colour map: should be a 256 colour indexed image (bmp, png, etc) -# height map: should be a greyscale image where "white" is higher -# -# both images must have the same dimensions which must be powers -# of two (for example 1024x1024, 256x256, etc). -# -# the images are broken up into 32x32 chunks and the chunks are stored -# in row-column order with height data and colour indexes interleaved. -# this allows a single chunk to be read from the file with a seek/read pair. -# -# the colour palette is also saved out as a continuous run of r, g, b -# byte triplets at the start of the file. -# -# the resulting file has the following format: -# -# colour palette information (768 bytes) -# chunk #1 (2048 bytes) -# chunk #2 (2048 bytes) -# ... -# chunk #n (2048 bytes) - -from PIL import Image -import sys -import os.path - -colour_map_filename = sys.argv[1] -height_map_filename = sys.argv[2] -output_filename = sys.argv[3] - -colour_map_image = Image.open(colour_map_filename) -height_map_image = Image.open(height_map_filename) - -width, height = colour_map_image.size - -chunks = int(width / 32) - -data = [] - -palette = colour_map_image.getpalette() -for i in range(0, 256): - data.append(palette[i * 3 + 0]) - data.append(palette[i * 3 + 1]) - data.append(palette[i * 3 + 2]) - -for cy in range(0, chunks): - for cx in range(0, chunks): - for py in range(0, 32): - for px in range(0, 32): - data.append(height_map_image.getpixel((px + cx * 32, py + cy * 32))) - data.append(colour_map_image.getpixel((px + cx * 32, py + cy * 32))) - -map_file = open(output_filename, "wb") -map_file.write(bytearray(data)) diff --git a/examples/voxel/voxel-icon.png b/examples/voxel/voxel-icon.png deleted file mode 100644 index a388ff766..000000000 Binary files a/examples/voxel/voxel-icon.png and /dev/null differ diff --git a/examples/voxel/voxel.cpp b/examples/voxel/voxel.cpp deleted file mode 100644 index dd3fdf921..000000000 --- a/examples/voxel/voxel.cpp +++ /dev/null @@ -1,292 +0,0 @@ -/* - 32blit Voxel Terrain demo - - by Jonathan Williamson (lowfatcode) -*/ - -#include - -#include "32blit.hpp" -#include "assets.hpp" - -using namespace blit; - - -Pen sky_colour = Pen(127, 182, 212, 255); -Pen colour_map_palette[256]; - -uint16_t *tiles[32][32]; -std::vector free_tiles; - -constexpr uint16_t tile_cache_size = 120; -uint16_t tile_cache[32 * 32 * tile_cache_size]; - -Vec3 position(64, 64, 100); -float angle = 0.0f; -float lean = 0.0f; -float pitch = 0.0f; - -uint8_t visited[32][32]; - -uint32_t terrain_file; -uint8_t terrain_index = 1; - - - -void load_map() { - //close_file(terrain_file); - //terrain_file = open_file(std::to_string(terrain_index) + ".map"); - - // load palette data - //if(read_file(terrain_file, 0, 768, (char *)buffer) == 768) { - for(uint16_t i = 0; i < 256; i++) { - colour_map_palette[i] = Pen(demo_map[i * 3 + 0], demo_map[i * 3 + 1], demo_map[i * 3 + 2]); - } - //} - - for(uint8_t y = 0; y < 32; y++) { - for(uint8_t x = 0; x < 32; x++) { - tiles[x][y] = nullptr; - } - } - - free_tiles.clear(); - for(uint8_t i = 0; i < tile_cache_size; i++) { - free_tiles.push_back(&tile_cache[32 * 32 * i]); - } -} - -void init() { - set_screen_mode(ScreenMode::lores); - load_map(); -} - -void load_tile(int16_t x, int16_t y) { - uint32_t tile_size = 32 * 32 * 2; - uint32_t offset = 768 + ((x + y * 32) * tile_size); - - if(free_tiles.size() > 0) { - tiles[x][y] = free_tiles.back(); - free_tiles.pop_back(); - - memcpy((char *)tiles[x][y], demo_map + offset, tile_size); - - //read_file(terrain_file, offset, tile_size, (char *)tiles[x][y]); - } -} - -uint16_t get_sample(int16_t x, int16_t y) { - // work out the tile coordinates for this sample - uint8_t tx = (x >> 5) & 0x1f; - uint8_t ty = (y >> 5) & 0x1f; - - visited[tx][ty] = 1; - - if(tiles[tx][ty] == nullptr) { - return 0; - } - - // work out the coordinates (within the tile) for the sample - uint16_t sx = x & 0x1f; - uint16_t sy = y & 0x1f; - - return tiles[tx][ty][sx + sy * 32]; -} - -float deg2rad(float d) { - return d * pi / 180.0f; -} - -void draw_world(Vec3 position, float angle, float lean, float horizon, float near, float far) { - static int16_t height_buffer[160]; - - memset(visited, 0, 32 * 32); - - // reset the height buffer to the bottom of the screen - for(auto i = 0; i < screen.bounds.w; i++) { - height_buffer[i] = screen.bounds.h; - } - - // convert angle into radians - angle = deg2rad(angle); - float sina = sinf(angle); - float cosa = cosf(angle); - - // starting z value - float z = near; - - while(z < far) { - - // calculate the left and right Points for the current sample span - Vec2 frustrum_left = Vec2(-cosa * z - sina * z, sina * z - cosa * z); - Vec2 frustrum_right = Vec2( cosa * z - sina * z, -sina * z - cosa * z); - - // calculate the step size along the span for each screen column drawn - Vec2 sample_step((frustrum_right.x - frustrum_left.x) / screen.bounds.w, (frustrum_right.y - frustrum_left.y) / screen.bounds.w); - float lean_step = lean * 2.0f / screen.bounds.w; - - // pre-multiply the fog alpha for this z-distance - uint8_t fog_blend = (z / far / 1.5f) * 255; // value for "amount of fog" from 0 to 255 - Pen fog((sky_colour.r * fog_blend) >> 8, (sky_colour.g * fog_blend) >> 8, (sky_colour.b * fog_blend) >> 8); - fog_blend = 255 - fog_blend; - - // Point being sampled, starts on the left of the view frustrum and is stepped forward each - // screen column drawn until it reaches the right of the view frustrum - Vec2 sample_point = frustrum_left + Vec2(position.x, position.y); - float sample_lean = -lean; - - float invz = 1.0f / z * 100.0f; - - // for each column on the screen... - for(uint16_t i = 0; i < screen.bounds.w; i++) { - - uint16_t sample = get_sample(sample_point.x, sample_point.y); - uint8_t colour_index = sample >> 8; - - // convert the height map sample into a y coordinate on screen - int16_t height = (position.z - (sample & 0xff)) * invz + float(horizon) + sample_lean; - - // if the height is smaller (further up the screen) than our current height buffer - // value then we need to draw a new vertical strip - if(height < height_buffer[i]) { - // fetch the colour for this strip from the colour map - Pen colour = colour_map_palette[colour_index]; - - // blend terrain colour with pre-multiplied fog colour - colour.r = ((colour.r * fog_blend) >> 8) + fog.r; - colour.g = ((colour.g * fog_blend) >> 8) + fog.g; - colour.b = ((colour.b * fog_blend) >> 8) + fog.b; - - // draw the vertical strip - screen.pen = colour; - screen.v_span(Point(i, height), height_buffer[i] - height); - - // update the height buffer to save that we've draw this far - // up the screen - height_buffer[i] = height; - } - - // move to the next sampling coordinate - sample_point += sample_step; - sample_lean += lean_step; - } - - // move forward (into the distance) in increasingly large steps - z *= 1.025f; - } -} - - - -void render(uint32_t time_ms) { - - // draw the sky - screen.pen = sky_colour; - screen.clear(); - - uint32_t ms_start = now(); - draw_world( - position, // player position - angle, // player direction - lean, - 20.0f + pitch, // horizon position - 3.0f, // near distance - 300.0f // far distance - ); - uint32_t ms_end = now(); - - for(uint8_t y = 0; y < 32; y++) { - for(uint8_t x = 0; x < 32; x++) { - - if(tiles[x][y] != nullptr) { - screen.pen = Pen(255, 0, 0, 100); - }else{ - screen.pen = Pen(0, 0, 0, 100); - } - screen.pixel(Point(x, y)); - - if(visited[x][y]) { - screen.pen = Pen(255, 255, 0, 100); - screen.pixel(Point(x, y)); - } - } - } - - // work out the tile coordinates for the player position - uint8_t tx = (int32_t(position.x) >> 5) & 0x1f; - uint8_t ty = (int32_t(position.y) >> 5) & 0x1f; - screen.pen = Pen(0, 255, 0); - screen.pixel(Point(tx, ty)); - - // draw FPS meter & watermark - screen.watermark(); - screen.mask = nullptr; - screen.pen = Pen(255, 255, 255); - - screen.text(std::to_string(ms_end - ms_start), minimal_font, Point(1, 230)); - screen.pen = Pen(255, 0, 0); - for (int i = 0; i < uint16_t(ms_end - ms_start); i++) { - screen.pen = Pen(i * 5, 255 - (i * 5), 0); - screen.rectangle(Rect(i * 3 + 1, 237, 2, 2)); - } -} - -void update(uint32_t time_ms) { - static uint16_t tick = 0; - - tick++; - - // update angle of player based on joystick input - float old_angle = angle; - angle -= joystick.x * 2.0f; - - lean = (angle - old_angle) * 10.0f; - - if(buttons & DPAD_UP) { - position.z += 1.0f; - } - - if(buttons & DPAD_DOWN) { - position.z -= 1.0f; - } - - // move player location if joystick y axis is forward/backwards - position.x += sinf(deg2rad(angle)) * joystick.y; - position.y += cosf(deg2rad(angle)) * joystick.y; - pitch = joystick.y * 20.0f; - - position.x = position.x < 0.0f ? 1023.0f : position.x; - position.y = position.y < 0.0f ? 1023.0f : position.y; - - position.x = position.x > 1023.0f ? 0.0f : position.x; - position.y = position.y > 1023.0f ? 0.0f : position.y; - - - // remove any unused tiles from the cache - for(uint8_t y = 0; y < 32; y++) { - for(uint8_t x = 0; x < 32; x++) { - if(tiles[x][y] != nullptr && !visited[x][y]) { - free_tiles.push_back(tiles[x][y]); - tiles[x][y] = nullptr; - } - } - } - - // load the next needed tile into the cache - for(uint8_t y = 0; y < 32; y++) { - for(uint8_t x = 0; x < 32; x++) { - if(tiles[x][y] == nullptr && visited[x][y]) { - load_tile(x, y); - //return; // quit out early if we load a new tile - } - } - } - - if(buttons.released & A) { - terrain_index++; - if(terrain_index > 4) { - terrain_index = 1; - } - load_map(); - } -} diff --git a/examples/voxel/voxel.png b/examples/voxel/voxel.png deleted file mode 100644 index 3fdbec5e9..000000000 Binary files a/examples/voxel/voxel.png and /dev/null differ diff --git a/examples/waveform-demo/CMakeLists.txt b/examples/waveform-demo/CMakeLists.txt deleted file mode 100644 index e53f2ca95..000000000 --- a/examples/waveform-demo/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project (waveform-demo) -find_package (32BLIT CONFIG REQUIRED PATHS ../..) -blit_executable (waveform-demo waveform-demo.cpp) -blit_metadata (waveform-demo metadata.yml) diff --git a/examples/waveform-demo/metadata.yml b/examples/waveform-demo/metadata.yml deleted file mode 100644 index 8a4eee40b..000000000 --- a/examples/waveform-demo/metadata.yml +++ /dev/null @@ -1,10 +0,0 @@ -title: Waveform Demo -description: A demo of the 32blit's waveform generator. -author: ThePythonator -splash: - file: waveform-demo.png -icon: - file: waveform-demo-icon.png -version: v0.3.0 -url: https://github.com/32blit/32blit-sdk -category: demo diff --git a/examples/waveform-demo/waveform-demo-icon.png b/examples/waveform-demo/waveform-demo-icon.png deleted file mode 100644 index f52ebf661..000000000 Binary files a/examples/waveform-demo/waveform-demo-icon.png and /dev/null differ diff --git a/examples/waveform-demo/waveform-demo.cpp b/examples/waveform-demo/waveform-demo.cpp deleted file mode 100644 index 353d9051d..000000000 --- a/examples/waveform-demo/waveform-demo.cpp +++ /dev/null @@ -1,324 +0,0 @@ -#include "waveform-demo.hpp" - -using namespace blit; - -enum CurrentSound { - NO_SOUND, - A_SOUND, - B_SOUND, - X_SOUND, - Y_SOUND, - UP_SOUND, - DOWN_SOUND, - LEFT_SOUND, - RIGHT_SOUND -}; - -// current_sound determines which sound is currently playing. -// -1 indicates no sound. -CurrentSound current_sound = NO_SOUND; - -// sound_sweep is used when changing the frequency of the waveform during playback -float sound_sweep = 0.0f; - -// start_time is used to calculate how long a waveform has been playing for (e.g. to do frequency jumps) -uint32_t start_time = 0; - -// frequency_jump_done is used to check if we've jumped the frequency yet -bool frequency_jump_done = false; - -// sound_time is used to store how long a waveform has been playing for -uint32_t sound_time = 0; - -/////////////////////////////////////////////////////////////////////////// -// -// init() -// -// setup your game here -// -void init() { - set_screen_mode(ScreenMode::lores); - - // Set up waveform presets. - - channels[0].waveforms = Waveform::SQUARE; - channels[0].frequency = 0; - channels[0].attack_ms = 5; - channels[0].decay_ms = 400; - channels[0].sustain = 0; - channels[0].release_ms = 5; - - channels[1].waveforms = Waveform::TRIANGLE; - channels[1].frequency = 0; - channels[1].attack_ms = 5; - channels[1].decay_ms = 300; - channels[1].sustain = 0; - channels[1].release_ms = 5; - - channels[2].waveforms = Waveform::TRIANGLE; - channels[2].frequency = 800; - channels[2].attack_ms = 5; - channels[2].decay_ms = 500; - channels[2].sustain = 0; - channels[2].release_ms = 5; - - channels[3].waveforms = Waveform::TRIANGLE; - channels[3].frequency = 0; - channels[3].attack_ms = 5; - channels[3].decay_ms = 400; - channels[3].sustain = 0; - channels[3].release_ms = 5; - - channels[4].waveforms = Waveform::NOISE; - channels[4].frequency = 7700; - channels[4].attack_ms = 5; - channels[4].decay_ms = 350; - channels[4].sustain = 0; - channels[4].release_ms = 5; - - channels[5].waveforms = Waveform::SINE; - channels[5].frequency = 0; - channels[5].attack_ms = 5; - channels[5].decay_ms = 400; - channels[5].sustain = 0; - channels[5].release_ms = 5; - - channels[6].waveforms = Waveform::TRIANGLE; - channels[6].frequency = 1400; - channels[6].attack_ms = 5; - channels[6].decay_ms = 100; - channels[6].sustain = 0; - channels[6].release_ms = 5; - - channels[7].waveforms = Waveform::SINE; - channels[7].frequency = 0; - channels[7].attack_ms = 5; - channels[7].decay_ms = 500; - channels[7].sustain = 0; - channels[7].release_ms = 5; -} - -/////////////////////////////////////////////////////////////////////////// -// -// render(time) -// -// This function is called to perform rendering of the game. time is the -// amount if milliseconds elapsed since the start of your game -// -void render(uint32_t time) { - - // Clear the screen. - screen.clear(); - - // Draw some text ont the screen. - screen.alpha = 255; - screen.mask = nullptr; - screen.pen = Pen(255, 255, 255); - screen.rectangle(Rect(0, 0, 160, 14)); - screen.text("Press a button to", minimal_font, Point(5, 24)); - screen.text("play a sound", minimal_font, Point(5, 32)); - - std::string text = "Current sound: "; - - if (current_sound != NO_SOUND) { - // A sound is playing currently. - // Display text indicating which sound. - - text.append(std::to_string(current_sound)); - } - - screen.text(text, minimal_font, Point(5, 48)); - - screen.pen = Pen(0, 0, 0); - screen.text("Waveform Demo", minimal_font, Point(5, 4)); -} - -/////////////////////////////////////////////////////////////////////////// -// -// update(time) -// -// This is called to update your game state. time is the -// amount if milliseconds elapsed since the start of your game -// -void update(uint32_t time) { - if (current_sound == NO_SOUND) { - // No sound is currently playing, let's see if we need to play a sound now... - - // Generate a sound if a button is pressed (and only if no other sounds are playing). - - // Only detect one button press at a time (by using else if) because reasons. - - if (buttons.pressed & Button::X) { - current_sound = X_SOUND; - - channels[0].trigger_attack(); - sound_sweep = 1.0f; - - start_time = time; - } - else if (buttons.pressed & Button::A) { - current_sound = A_SOUND; - - channels[1].trigger_attack(); - sound_sweep = 1.0f; - - start_time = time; - } - else if (buttons.pressed & Button::B) { - current_sound = B_SOUND; - - channels[2].frequency = 800; - channels[2].trigger_attack(); - - frequency_jump_done = false; - start_time = time; - } - else if (buttons.pressed & Button::Y) { - current_sound = Y_SOUND; - - channels[3].trigger_attack(); - sound_sweep = 1.0f; - - start_time = time; - } - else if (buttons.pressed & Button::DPAD_UP) { - current_sound = UP_SOUND; - - channels[4].trigger_attack(); - - start_time = time; - } - else if (buttons.pressed & Button::DPAD_RIGHT) { - current_sound = RIGHT_SOUND; - - channels[5].trigger_attack(); - sound_sweep = 1.0f; - - start_time = time; - } - else if (buttons.pressed & Button::DPAD_DOWN) { - current_sound = DOWN_SOUND; - - channels[6].trigger_attack(); - - start_time = time; - } - else if (buttons.pressed & Button::DPAD_LEFT) { - current_sound = LEFT_SOUND; - - channels[7].trigger_attack(); - sound_sweep = 1.0f; - - start_time = time; - } - } - - if (current_sound == NO_SOUND) { - sound_time = 0; - } - else { - sound_time = time - start_time; - } - - // Update the sounds which are playing. - - switch (current_sound) { - case X_SOUND: - if (sound_time > 400) { - // Stop sound - current_sound = NO_SOUND; - channels[0].trigger_release(); - } - else { - // Update the sweep - channels[0].frequency = 1000 - (400.0f * sound_sweep); - sound_sweep -= 0.01f; - } - break; - - case A_SOUND: - if (sound_time > 300) { - // Stop sound - current_sound = NO_SOUND; - channels[1].trigger_release(); - } - else { - // Update the sweep - channels[1].frequency = 1300 - (1000.0f * sound_sweep); - sound_sweep -= 0.01f; - } - break; - - case B_SOUND: - if (sound_time > 500) { - // Stop sound - current_sound = NO_SOUND; - channels[2].trigger_release(); - } - else if (sound_time > 200 && !frequency_jump_done) { - // Jump the frequency by 60% - channels[2].frequency *= 1.6; - frequency_jump_done = true; - } - break; - - case Y_SOUND: - if (sound_time > 400) { - // Stop sound - current_sound = NO_SOUND; - channels[3].trigger_release(); - } - else { - // Update the sweep - channels[3].frequency = 1300.0f * sound_sweep; - sound_sweep -= 0.01f; - } - break; - - case UP_SOUND: - if (sound_time > 350) { - // Stop sound - current_sound = NO_SOUND; - channels[4].trigger_release(); - } - break; - - case RIGHT_SOUND: - if (sound_time > 400) { - // Stop sound - current_sound = NO_SOUND; - channels[5].trigger_release(); - } - else { - // Update the sweep - channels[5].frequency = 1800 - (1000.0f * sound_sweep); - sound_sweep -= 0.05f; - } - break; - - case DOWN_SOUND: - if (sound_time > 100) { - // Stop sound - current_sound = NO_SOUND; - channels[6].trigger_release(); - } - break; - - case LEFT_SOUND: - if (sound_time > 500) { - // Stop sound - current_sound = NO_SOUND; - channels[7].trigger_release(); - } - else { - // Update the sweep - channels[7].frequency = (3000.0f * sound_sweep) - 800; - sound_sweep -= 0.05f; - } - break; - - default: - // No sound playing - break; - } -} diff --git a/examples/waveform-demo/waveform-demo.hpp b/examples/waveform-demo/waveform-demo.hpp deleted file mode 100644 index b4df8bd93..000000000 --- a/examples/waveform-demo/waveform-demo.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "32blit.hpp" diff --git a/examples/waveform-demo/waveform-demo.png b/examples/waveform-demo/waveform-demo.png deleted file mode 100644 index 4222d0b8c..000000000 Binary files a/examples/waveform-demo/waveform-demo.png and /dev/null differ diff --git a/examples/no-icon.png b/firmware-update/assets/no-icon.png similarity index 100% rename from examples/no-icon.png rename to firmware-update/assets/no-icon.png diff --git a/examples/no-image.png b/firmware-update/assets/no-image.png similarity index 100% rename from examples/no-image.png rename to firmware-update/assets/no-image.png diff --git a/firmware-update/metadata.yml.in b/firmware-update/metadata.yml.in index 03dc8b18a..e5daf10e8 100644 --- a/firmware-update/metadata.yml.in +++ b/firmware-update/metadata.yml.in @@ -2,9 +2,9 @@ title: Firmware Updater description: Updates firmware to ${FIRMWARE_VERSION} author: pimoroni splash: - file: ../examples/no-image.png + file: assets/no-image.png icon: - file: ../examples/no-icon.png + file: assets/no-icon.png version: ${FIRMWARE_VERSION} url: https://github.com/32blit/32blit-sdk category: firmware diff --git a/examples/tunnel/tunnel-icon.png b/launcher/assets/no-icon.png similarity index 74% rename from examples/tunnel/tunnel-icon.png rename to launcher/assets/no-icon.png index 7f48e2a27..cd4d2e298 100644 Binary files a/examples/tunnel/tunnel-icon.png and b/launcher/assets/no-icon.png differ diff --git a/launcher/assets/no-image.png b/launcher/assets/no-image.png new file mode 100644 index 000000000..3c720639f Binary files /dev/null and b/launcher/assets/no-image.png differ diff --git a/launcher/metadata.yml b/launcher/metadata.yml index 55978f811..5f045db9a 100644 --- a/launcher/metadata.yml +++ b/launcher/metadata.yml @@ -2,9 +2,9 @@ title: Launcher description: Launches things. author: pimoroni splash: - file: ../examples/no-image.png + file: assets/no-image.png icon: - file: ../examples/no-icon.png + file: assets/no-icon.png version: v1.0.0 url: https://github.com/32blit/32blit-sdk -category: launcher \ No newline at end of file +category: launcher diff --git a/utilities/CMakeLists.txt b/utilities/CMakeLists.txt new file mode 100644 index 000000000..e86ebf1c6 --- /dev/null +++ b/utilities/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.9) +project (examples) +find_package (32BLIT CONFIG REQUIRED PATHS ..) + +add_subdirectory(hardware-test) +add_subdirectory(picosystem-hardware-test) diff --git a/examples/hardware-test/CMakeLists.txt b/utilities/hardware-test/CMakeLists.txt similarity index 100% rename from examples/hardware-test/CMakeLists.txt rename to utilities/hardware-test/CMakeLists.txt diff --git a/examples/hardware-test/hardware-test-icon.png b/utilities/hardware-test/hardware-test-icon.png similarity index 100% rename from examples/hardware-test/hardware-test-icon.png rename to utilities/hardware-test/hardware-test-icon.png diff --git a/examples/hardware-test/hardware-test.cpp b/utilities/hardware-test/hardware-test.cpp similarity index 100% rename from examples/hardware-test/hardware-test.cpp rename to utilities/hardware-test/hardware-test.cpp diff --git a/examples/hardware-test/hardware-test.hpp b/utilities/hardware-test/hardware-test.hpp similarity index 100% rename from examples/hardware-test/hardware-test.hpp rename to utilities/hardware-test/hardware-test.hpp diff --git a/examples/hardware-test/hardware-test.png b/utilities/hardware-test/hardware-test.png similarity index 100% rename from examples/hardware-test/hardware-test.png rename to utilities/hardware-test/hardware-test.png diff --git a/examples/hardware-test/metadata.yml b/utilities/hardware-test/metadata.yml similarity index 100% rename from examples/hardware-test/metadata.yml rename to utilities/hardware-test/metadata.yml diff --git a/examples/picosystem-hardware-test/CMakeLists.txt b/utilities/picosystem-hardware-test/CMakeLists.txt similarity index 100% rename from examples/picosystem-hardware-test/CMakeLists.txt rename to utilities/picosystem-hardware-test/CMakeLists.txt diff --git a/examples/picosystem-hardware-test/hardware-test-icon.png b/utilities/picosystem-hardware-test/hardware-test-icon.png similarity index 100% rename from examples/picosystem-hardware-test/hardware-test-icon.png rename to utilities/picosystem-hardware-test/hardware-test-icon.png diff --git a/examples/picosystem-hardware-test/hardware-test.cpp b/utilities/picosystem-hardware-test/hardware-test.cpp similarity index 100% rename from examples/picosystem-hardware-test/hardware-test.cpp rename to utilities/picosystem-hardware-test/hardware-test.cpp diff --git a/examples/picosystem-hardware-test/hardware-test.hpp b/utilities/picosystem-hardware-test/hardware-test.hpp similarity index 100% rename from examples/picosystem-hardware-test/hardware-test.hpp rename to utilities/picosystem-hardware-test/hardware-test.hpp diff --git a/examples/picosystem-hardware-test/hardware-test.png b/utilities/picosystem-hardware-test/hardware-test.png similarity index 100% rename from examples/picosystem-hardware-test/hardware-test.png rename to utilities/picosystem-hardware-test/hardware-test.png diff --git a/examples/picosystem-hardware-test/metadata.yml b/utilities/picosystem-hardware-test/metadata.yml similarity index 100% rename from examples/picosystem-hardware-test/metadata.yml rename to utilities/picosystem-hardware-test/metadata.yml diff --git a/vs/.gitignore b/vs/.gitignore index d01b47470..c50fc88eb 100644 --- a/vs/.gitignore +++ b/vs/.gitignore @@ -1,359 +1,2 @@ -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore - -# User-specific files -*.rsuser -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Mono auto generated files -mono_crash.* - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ -[Ll]ogs/ - -# Visual Studio 2015/2017 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUnit -*.VisualState.xml -TestResult.xml -nunit-*.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio -*_i.c -*_p.c -*_h.h -*.ilk -*.meta -*.obj -*.iobj -*.pch -*.pdb -*.ipdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*_wpftmp.csproj -*.log -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Coverlet is a free, cross platform Code Coverage Tool -coverage*[.json, .xml, .info] - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# NuGet Symbol Packages -*.snupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx -*.appxbundle -*.appxupload - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!?*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser -*- [Bb]ackup.rdl -*- [Bb]ackup ([0-9]).rdl -*- [Bb]ackup ([0-9][0-9]).rdl - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# CodeRush personal settings -.cr/personal - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -.mfractor/ - -# Local History for Visual Studio -.localhistory/ - -# BeatPulse healthcheck temp database -healthchecksdb - -# Backup folder for Package Reference Convert tool in Visual Studio 2017 -MigrationBackup/ - -# Ionide (cross platform F# VS Code tools) working folder -.ionide/ - # SDL dependencies sdl/ - - -assets.* \ No newline at end of file diff --git a/vs/32blit-sdl/32blit-sdl.vcxproj b/vs/32blit-sdl/32blit-sdl.vcxproj deleted file mode 100644 index 36d187092..000000000 --- a/vs/32blit-sdl/32blit-sdl.vcxproj +++ /dev/null @@ -1,226 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} - Win32Proj - My32blitsdl - 10.0 - - - - StaticLibrary - true - v142 - Unicode - - - StaticLibrary - false - v142 - true - Unicode - - - StaticLibrary - true - v142 - Unicode - - - StaticLibrary - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - - - true - - - false - - - false - - - - NotUsing - Level3 - true - WIN32;_DEBUG;_LIB;WIN32;%(PreprocessorDefinitions) - true - pch.h - ..\sdl\include;..\..\32blit - stdcpp17 - - - Windows - true - - - SDL2.lib;SDL2_image.lib - - - ..\sdl\lib\$(PlatformTarget) - - - xcopy /y /d "$(ProjectDir)..\sdl\lib\$(PlatformTarget)\*.dll" "$(Outdir)" - Copy SDL DLLs into output directory - - - - - NotUsing - Level3 - true - _DEBUG;_LIB;WIN32;%(PreprocessorDefinitions) - true - pch.h - stdcpp17 - ..\sdl\include;..\..\32blit - - - Windows - true - - - SDL2.lib;SDL2_image.lib;SDL2_net.lib - - - ..\sdl\lib\$(PlatformTarget) - - - xcopy /y /d "$(ProjectDir)..\sdl\lib\$(PlatformTarget)\*.dll" "$(Outdir)" - - - Copy SDL DLLs into output directory - - - - - NotUsing - Level3 - true - true - true - WIN32;NDEBUG;_LIB;WIN32;%(PreprocessorDefinitions) - true - pch.h - stdcpp17 - ..\sdl\include;..\..\32blit - - - Windows - true - true - true - - - SDL2.lib;SDL2_image.lib;SDL2_net.lib - - - ..\sdl\lib\$(PlatformTarget) - - - xcopy /y /d "$(ProjectDir)..\sdl\lib\$(PlatformTarget)\*.dll" "$(Outdir)" - - - Copy SDL DLLs into output directory - - - - - NotUsing - Level3 - true - true - true - NDEBUG;_LIB;WIN32;%(PreprocessorDefinitions) - true - pch.h - stdcpp17 - ..\sdl\include;..\..\32blit - - - Windows - true - true - true - - - SDL2.lib;SDL2_image.lib - - - ..\sdl\lib\$(PlatformTarget) - - - xcopy /y /d "$(ProjectDir)..\sdl\lib\$(PlatformTarget)\*.dll" "$(Outdir)" - - - Copy SDL DLLs into output directory - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vs/32blit-sdl/32blit-sdl.vcxproj.filters b/vs/32blit-sdl/32blit-sdl.vcxproj.filters deleted file mode 100644 index d5c9b30d4..000000000 --- a/vs/32blit-sdl/32blit-sdl.vcxproj.filters +++ /dev/null @@ -1,60 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;ipp;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - \ No newline at end of file diff --git a/vs/32blit.sln b/vs/32blit.sln deleted file mode 100644 index 15f0c7700..000000000 --- a/vs/32blit.sln +++ /dev/null @@ -1,438 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29613.14 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "32blit", "32blit\32blit.vcxproj", "{280015A3-83D7-416F-A181-7CF88BCCE12F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "32blit-sdl", "32blit-sdl\32blit-sdl.vcxproj", "{85DB89B5-DEA0-4429-B41E-0CAA7DB907BA}" - ProjectSection(ProjectDependencies) = postProject - {280015A3-83D7-416F-A181-7CF88BCCE12F} = {280015A3-83D7-416F-A181-7CF88BCCE12F} - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "examples", "examples", "{E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "logo", "examples\logo\logo.vcxproj", "{3C0D173C-82A1-43AB-8E9C-DE3F0067AD59}" - ProjectSection(ProjectDependencies) = postProject - {280015A3-83D7-416F-A181-7CF88BCCE12F} = {280015A3-83D7-416F-A181-7CF88BCCE12F} - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} = {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doom-fire", "examples\doom-fire\doom-fire.vcxproj", "{84B611CC-F139-4EC6-8ABB-7BD176E152A8}" - ProjectSection(ProjectDependencies) = postProject - {280015A3-83D7-416F-A181-7CF88BCCE12F} = {280015A3-83D7-416F-A181-7CF88BCCE12F} - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} = {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fizzlefade", "examples\fizzlefade\fizzlefade.vcxproj", "{5E4753A9-63CA-449D-A28D-E0B9F77BE1E2}" - ProjectSection(ProjectDependencies) = postProject - {280015A3-83D7-416F-A181-7CF88BCCE12F} = {280015A3-83D7-416F-A181-7CF88BCCE12F} - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} = {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "flight", "examples\flight\flight.vcxproj", "{59D4112B-F51B-4FCE-ADD0-A6DA933FE708}" - ProjectSection(ProjectDependencies) = postProject - {280015A3-83D7-416F-A181-7CF88BCCE12F} = {280015A3-83D7-416F-A181-7CF88BCCE12F} - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} = {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "geometry", "examples\geometry\geometry.vcxproj", "{E97885DB-2D89-40CC-B608-8E9071FB3930}" - ProjectSection(ProjectDependencies) = postProject - {280015A3-83D7-416F-A181-7CF88BCCE12F} = {280015A3-83D7-416F-A181-7CF88BCCE12F} - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} = {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hardware-test", "examples\hardware-test\hardware-test.vcxproj", "{388C602D-8120-40F4-B6FD-69A3559374B6}" - ProjectSection(ProjectDependencies) = postProject - {280015A3-83D7-416F-A181-7CF88BCCE12F} = {280015A3-83D7-416F-A181-7CF88BCCE12F} - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} = {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "matrix-test", "examples\matrix-test\matrix-test.vcxproj", "{AEB7FC97-00B4-4264-A8E0-F265ACFD4A1F}" - ProjectSection(ProjectDependencies) = postProject - {280015A3-83D7-416F-A181-7CF88BCCE12F} = {280015A3-83D7-416F-A181-7CF88BCCE12F} - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} = {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "palette-cycle", "examples\palette-cycle\palette-cycle.vcxproj", "{20969476-9E64-4E4F-981C-590900DB1EEA}" - ProjectSection(ProjectDependencies) = postProject - {280015A3-83D7-416F-A181-7CF88BCCE12F} = {280015A3-83D7-416F-A181-7CF88BCCE12F} - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} = {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "palette-swap", "examples\palette-swap\palette-swap.vcxproj", "{189239CA-029E-4124-826B-F30AE3A87D68}" - ProjectSection(ProjectDependencies) = postProject - {280015A3-83D7-416F-A181-7CF88BCCE12F} = {280015A3-83D7-416F-A181-7CF88BCCE12F} - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} = {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "particle", "examples\particle\particle.vcxproj", "{DDF1DCE3-3171-4DF4-872D-C729E9857D19}" - ProjectSection(ProjectDependencies) = postProject - {280015A3-83D7-416F-A181-7CF88BCCE12F} = {280015A3-83D7-416F-A181-7CF88BCCE12F} - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} = {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "platformer", "examples\platformer\platformer.vcxproj", "{B6288555-A145-4E3A-9A6E-13D523272331}" - ProjectSection(ProjectDependencies) = postProject - {280015A3-83D7-416F-A181-7CF88BCCE12F} = {280015A3-83D7-416F-A181-7CF88BCCE12F} - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} = {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "raycaster", "examples\raycaster\raycaster.vcxproj", "{2A267ABC-21E2-4166-93FA-19AEB38B5C87}" - ProjectSection(ProjectDependencies) = postProject - {280015A3-83D7-416F-A181-7CF88BCCE12F} = {280015A3-83D7-416F-A181-7CF88BCCE12F} - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} = {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rotozoom", "examples\rotozoom\rotozoom.vcxproj", "{B5B41CDA-BE4B-43C8-9E9D-D7A261FA5396}" - ProjectSection(ProjectDependencies) = postProject - {280015A3-83D7-416F-A181-7CF88BCCE12F} = {280015A3-83D7-416F-A181-7CF88BCCE12F} - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} = {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "scrolly-tile", "examples\scrolly-tile\scrolly-tile.vcxproj", "{F9E896C3-C52E-47B9-96A8-58B819D69373}" - ProjectSection(ProjectDependencies) = postProject - {280015A3-83D7-416F-A181-7CF88BCCE12F} = {280015A3-83D7-416F-A181-7CF88BCCE12F} - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} = {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shmup", "examples\shmup\shmup.vcxproj", "{F5428427-2228-408B-81FD-F75CFDD4F2B4}" - ProjectSection(ProjectDependencies) = postProject - {280015A3-83D7-416F-A181-7CF88BCCE12F} = {280015A3-83D7-416F-A181-7CF88BCCE12F} - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} = {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sprite-test", "examples\sprite-test\sprite-test.vcxproj", "{FE6094EE-5371-4D9B-A90A-0C5D12632EBF}" - ProjectSection(ProjectDependencies) = postProject - {280015A3-83D7-416F-A181-7CF88BCCE12F} = {280015A3-83D7-416F-A181-7CF88BCCE12F} - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} = {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tilemap_test", "examples\tilemap_test\tilemap_test.vcxproj", "{46BF246B-4151-4048-B4CC-285D1A343CE2}" - ProjectSection(ProjectDependencies) = postProject - {280015A3-83D7-416F-A181-7CF88BCCE12F} = {280015A3-83D7-416F-A181-7CF88BCCE12F} - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} = {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tilt", "examples\tilt\tilt.vcxproj", "{1536271F-BCB7-4A9A-BFDB-78FABE8D82B7}" - ProjectSection(ProjectDependencies) = postProject - {280015A3-83D7-416F-A181-7CF88BCCE12F} = {280015A3-83D7-416F-A181-7CF88BCCE12F} - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} = {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "timer-test", "examples\timer-test\timer-test.vcxproj", "{DACA3506-77BD-4532-A8A0-6D5D5E1A5558}" - ProjectSection(ProjectDependencies) = postProject - {280015A3-83D7-416F-A181-7CF88BCCE12F} = {280015A3-83D7-416F-A181-7CF88BCCE12F} - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} = {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tunnel", "examples\tunnel\tunnel.vcxproj", "{12F21AB0-F00E-426D-A3D1-E47DE8CDBAE8}" - ProjectSection(ProjectDependencies) = postProject - {280015A3-83D7-416F-A181-7CF88BCCE12F} = {280015A3-83D7-416F-A181-7CF88BCCE12F} - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} = {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tween-test", "examples\tween-test\tween-test.vcxproj", "{F0BA1CD4-B8E5-437D-B0D4-1DAF4A652AB3}" - ProjectSection(ProjectDependencies) = postProject - {280015A3-83D7-416F-A181-7CF88BCCE12F} = {280015A3-83D7-416F-A181-7CF88BCCE12F} - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} = {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "audio-test", "examples\audio-test\audio-test.vcxproj", "{2E5A800D-8DD7-43EA-83C3-2E1ED6F547CB}" - ProjectSection(ProjectDependencies) = postProject - {280015A3-83D7-416F-A181-7CF88BCCE12F} = {280015A3-83D7-416F-A181-7CF88BCCE12F} - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} = {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "text", "examples\text\text.vcxproj", "{479BBF48-BF4B-42AF-AF55-6D4E0A74C987}" - ProjectSection(ProjectDependencies) = postProject - {280015A3-83D7-416F-A181-7CF88BCCE12F} = {280015A3-83D7-416F-A181-7CF88BCCE12F} - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} = {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "voxel", "examples\voxel\voxel.vcxproj", "{2B7506AD-B420-4F2B-B002-6AAAF79D1E01}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tween-demo", "examples\tween-demo\tween-demo.vcxproj", "{46D6A7E3-73D9-422A-AD53-94D96380CDD5}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "launcher-shared", "launcher-shared\launcher-shared.vcxproj", "{3C1AA064-9D06-41FD-AB32-90832A03F452}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "launcher-app", "launcher-app", "{07434F7B-DE5A-4C13-BC49-4CBCE12D0040}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "launcher", "launcher\launcher.vcxproj", "{8608D71A-A686-41A2-9861-0FCD7DAF00AE}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {280015A3-83D7-416F-A181-7CF88BCCE12F}.Debug|x64.ActiveCfg = Debug|x64 - {280015A3-83D7-416F-A181-7CF88BCCE12F}.Debug|x64.Build.0 = Debug|x64 - {280015A3-83D7-416F-A181-7CF88BCCE12F}.Debug|x86.ActiveCfg = Debug|Win32 - {280015A3-83D7-416F-A181-7CF88BCCE12F}.Debug|x86.Build.0 = Debug|Win32 - {280015A3-83D7-416F-A181-7CF88BCCE12F}.Release|x64.ActiveCfg = Release|x64 - {280015A3-83D7-416F-A181-7CF88BCCE12F}.Release|x64.Build.0 = Release|x64 - {280015A3-83D7-416F-A181-7CF88BCCE12F}.Release|x86.ActiveCfg = Release|Win32 - {280015A3-83D7-416F-A181-7CF88BCCE12F}.Release|x86.Build.0 = Release|Win32 - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA}.Debug|x64.ActiveCfg = Debug|x64 - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA}.Debug|x64.Build.0 = Debug|x64 - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA}.Debug|x86.ActiveCfg = Debug|Win32 - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA}.Debug|x86.Build.0 = Debug|Win32 - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA}.Release|x64.ActiveCfg = Release|x64 - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA}.Release|x64.Build.0 = Release|x64 - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA}.Release|x86.ActiveCfg = Release|Win32 - {85DB89B5-DEA0-4429-B41E-0CAA7DB907BA}.Release|x86.Build.0 = Release|Win32 - {3C0D173C-82A1-43AB-8E9C-DE3F0067AD59}.Debug|x64.ActiveCfg = Debug|x64 - {3C0D173C-82A1-43AB-8E9C-DE3F0067AD59}.Debug|x64.Build.0 = Debug|x64 - {3C0D173C-82A1-43AB-8E9C-DE3F0067AD59}.Debug|x86.ActiveCfg = Debug|Win32 - {3C0D173C-82A1-43AB-8E9C-DE3F0067AD59}.Debug|x86.Build.0 = Debug|Win32 - {3C0D173C-82A1-43AB-8E9C-DE3F0067AD59}.Release|x64.ActiveCfg = Release|x64 - {3C0D173C-82A1-43AB-8E9C-DE3F0067AD59}.Release|x64.Build.0 = Release|x64 - {3C0D173C-82A1-43AB-8E9C-DE3F0067AD59}.Release|x86.ActiveCfg = Release|Win32 - {3C0D173C-82A1-43AB-8E9C-DE3F0067AD59}.Release|x86.Build.0 = Release|Win32 - {84B611CC-F139-4EC6-8ABB-7BD176E152A8}.Debug|x64.ActiveCfg = Debug|x64 - {84B611CC-F139-4EC6-8ABB-7BD176E152A8}.Debug|x64.Build.0 = Debug|x64 - {84B611CC-F139-4EC6-8ABB-7BD176E152A8}.Debug|x86.ActiveCfg = Debug|Win32 - {84B611CC-F139-4EC6-8ABB-7BD176E152A8}.Debug|x86.Build.0 = Debug|Win32 - {84B611CC-F139-4EC6-8ABB-7BD176E152A8}.Release|x64.ActiveCfg = Release|x64 - {84B611CC-F139-4EC6-8ABB-7BD176E152A8}.Release|x64.Build.0 = Release|x64 - {84B611CC-F139-4EC6-8ABB-7BD176E152A8}.Release|x86.ActiveCfg = Release|Win32 - {84B611CC-F139-4EC6-8ABB-7BD176E152A8}.Release|x86.Build.0 = Release|Win32 - {5E4753A9-63CA-449D-A28D-E0B9F77BE1E2}.Debug|x64.ActiveCfg = Debug|x64 - {5E4753A9-63CA-449D-A28D-E0B9F77BE1E2}.Debug|x64.Build.0 = Debug|x64 - {5E4753A9-63CA-449D-A28D-E0B9F77BE1E2}.Debug|x86.ActiveCfg = Debug|Win32 - {5E4753A9-63CA-449D-A28D-E0B9F77BE1E2}.Debug|x86.Build.0 = Debug|Win32 - {5E4753A9-63CA-449D-A28D-E0B9F77BE1E2}.Release|x64.ActiveCfg = Release|x64 - {5E4753A9-63CA-449D-A28D-E0B9F77BE1E2}.Release|x64.Build.0 = Release|x64 - {5E4753A9-63CA-449D-A28D-E0B9F77BE1E2}.Release|x86.ActiveCfg = Release|Win32 - {5E4753A9-63CA-449D-A28D-E0B9F77BE1E2}.Release|x86.Build.0 = Release|Win32 - {59D4112B-F51B-4FCE-ADD0-A6DA933FE708}.Debug|x64.ActiveCfg = Debug|x64 - {59D4112B-F51B-4FCE-ADD0-A6DA933FE708}.Debug|x64.Build.0 = Debug|x64 - {59D4112B-F51B-4FCE-ADD0-A6DA933FE708}.Debug|x86.ActiveCfg = Debug|Win32 - {59D4112B-F51B-4FCE-ADD0-A6DA933FE708}.Debug|x86.Build.0 = Debug|Win32 - {59D4112B-F51B-4FCE-ADD0-A6DA933FE708}.Release|x64.ActiveCfg = Release|x64 - {59D4112B-F51B-4FCE-ADD0-A6DA933FE708}.Release|x64.Build.0 = Release|x64 - {59D4112B-F51B-4FCE-ADD0-A6DA933FE708}.Release|x86.ActiveCfg = Release|Win32 - {59D4112B-F51B-4FCE-ADD0-A6DA933FE708}.Release|x86.Build.0 = Release|Win32 - {E97885DB-2D89-40CC-B608-8E9071FB3930}.Debug|x64.ActiveCfg = Debug|x64 - {E97885DB-2D89-40CC-B608-8E9071FB3930}.Debug|x64.Build.0 = Debug|x64 - {E97885DB-2D89-40CC-B608-8E9071FB3930}.Debug|x86.ActiveCfg = Debug|Win32 - {E97885DB-2D89-40CC-B608-8E9071FB3930}.Debug|x86.Build.0 = Debug|Win32 - {E97885DB-2D89-40CC-B608-8E9071FB3930}.Release|x64.ActiveCfg = Release|x64 - {E97885DB-2D89-40CC-B608-8E9071FB3930}.Release|x64.Build.0 = Release|x64 - {E97885DB-2D89-40CC-B608-8E9071FB3930}.Release|x86.ActiveCfg = Release|Win32 - {E97885DB-2D89-40CC-B608-8E9071FB3930}.Release|x86.Build.0 = Release|Win32 - {388C602D-8120-40F4-B6FD-69A3559374B6}.Debug|x64.ActiveCfg = Debug|x64 - {388C602D-8120-40F4-B6FD-69A3559374B6}.Debug|x64.Build.0 = Debug|x64 - {388C602D-8120-40F4-B6FD-69A3559374B6}.Debug|x86.ActiveCfg = Debug|Win32 - {388C602D-8120-40F4-B6FD-69A3559374B6}.Debug|x86.Build.0 = Debug|Win32 - {388C602D-8120-40F4-B6FD-69A3559374B6}.Release|x64.ActiveCfg = Release|x64 - {388C602D-8120-40F4-B6FD-69A3559374B6}.Release|x64.Build.0 = Release|x64 - {388C602D-8120-40F4-B6FD-69A3559374B6}.Release|x86.ActiveCfg = Release|Win32 - {388C602D-8120-40F4-B6FD-69A3559374B6}.Release|x86.Build.0 = Release|Win32 - {AEB7FC97-00B4-4264-A8E0-F265ACFD4A1F}.Debug|x64.ActiveCfg = Debug|x64 - {AEB7FC97-00B4-4264-A8E0-F265ACFD4A1F}.Debug|x64.Build.0 = Debug|x64 - {AEB7FC97-00B4-4264-A8E0-F265ACFD4A1F}.Debug|x86.ActiveCfg = Debug|Win32 - {AEB7FC97-00B4-4264-A8E0-F265ACFD4A1F}.Debug|x86.Build.0 = Debug|Win32 - {AEB7FC97-00B4-4264-A8E0-F265ACFD4A1F}.Release|x64.ActiveCfg = Release|x64 - {AEB7FC97-00B4-4264-A8E0-F265ACFD4A1F}.Release|x64.Build.0 = Release|x64 - {AEB7FC97-00B4-4264-A8E0-F265ACFD4A1F}.Release|x86.ActiveCfg = Release|Win32 - {AEB7FC97-00B4-4264-A8E0-F265ACFD4A1F}.Release|x86.Build.0 = Release|Win32 - {20969476-9E64-4E4F-981C-590900DB1EEA}.Debug|x64.ActiveCfg = Debug|x64 - {20969476-9E64-4E4F-981C-590900DB1EEA}.Debug|x64.Build.0 = Debug|x64 - {20969476-9E64-4E4F-981C-590900DB1EEA}.Debug|x86.ActiveCfg = Debug|Win32 - {20969476-9E64-4E4F-981C-590900DB1EEA}.Debug|x86.Build.0 = Debug|Win32 - {20969476-9E64-4E4F-981C-590900DB1EEA}.Release|x64.ActiveCfg = Release|x64 - {20969476-9E64-4E4F-981C-590900DB1EEA}.Release|x64.Build.0 = Release|x64 - {20969476-9E64-4E4F-981C-590900DB1EEA}.Release|x86.ActiveCfg = Release|Win32 - {20969476-9E64-4E4F-981C-590900DB1EEA}.Release|x86.Build.0 = Release|Win32 - {189239CA-029E-4124-826B-F30AE3A87D68}.Debug|x64.ActiveCfg = Debug|x64 - {189239CA-029E-4124-826B-F30AE3A87D68}.Debug|x64.Build.0 = Debug|x64 - {189239CA-029E-4124-826B-F30AE3A87D68}.Debug|x86.ActiveCfg = Debug|Win32 - {189239CA-029E-4124-826B-F30AE3A87D68}.Debug|x86.Build.0 = Debug|Win32 - {189239CA-029E-4124-826B-F30AE3A87D68}.Release|x64.ActiveCfg = Release|x64 - {189239CA-029E-4124-826B-F30AE3A87D68}.Release|x64.Build.0 = Release|x64 - {189239CA-029E-4124-826B-F30AE3A87D68}.Release|x86.ActiveCfg = Release|Win32 - {189239CA-029E-4124-826B-F30AE3A87D68}.Release|x86.Build.0 = Release|Win32 - {DDF1DCE3-3171-4DF4-872D-C729E9857D19}.Debug|x64.ActiveCfg = Debug|x64 - {DDF1DCE3-3171-4DF4-872D-C729E9857D19}.Debug|x64.Build.0 = Debug|x64 - {DDF1DCE3-3171-4DF4-872D-C729E9857D19}.Debug|x86.ActiveCfg = Debug|Win32 - {DDF1DCE3-3171-4DF4-872D-C729E9857D19}.Debug|x86.Build.0 = Debug|Win32 - {DDF1DCE3-3171-4DF4-872D-C729E9857D19}.Release|x64.ActiveCfg = Release|x64 - {DDF1DCE3-3171-4DF4-872D-C729E9857D19}.Release|x64.Build.0 = Release|x64 - {DDF1DCE3-3171-4DF4-872D-C729E9857D19}.Release|x86.ActiveCfg = Release|Win32 - {DDF1DCE3-3171-4DF4-872D-C729E9857D19}.Release|x86.Build.0 = Release|Win32 - {B6288555-A145-4E3A-9A6E-13D523272331}.Debug|x64.ActiveCfg = Debug|x64 - {B6288555-A145-4E3A-9A6E-13D523272331}.Debug|x64.Build.0 = Debug|x64 - {B6288555-A145-4E3A-9A6E-13D523272331}.Debug|x86.ActiveCfg = Debug|Win32 - {B6288555-A145-4E3A-9A6E-13D523272331}.Debug|x86.Build.0 = Debug|Win32 - {B6288555-A145-4E3A-9A6E-13D523272331}.Release|x64.ActiveCfg = Release|x64 - {B6288555-A145-4E3A-9A6E-13D523272331}.Release|x64.Build.0 = Release|x64 - {B6288555-A145-4E3A-9A6E-13D523272331}.Release|x86.ActiveCfg = Release|Win32 - {B6288555-A145-4E3A-9A6E-13D523272331}.Release|x86.Build.0 = Release|Win32 - {2A267ABC-21E2-4166-93FA-19AEB38B5C87}.Debug|x64.ActiveCfg = Debug|x64 - {2A267ABC-21E2-4166-93FA-19AEB38B5C87}.Debug|x64.Build.0 = Debug|x64 - {2A267ABC-21E2-4166-93FA-19AEB38B5C87}.Debug|x86.ActiveCfg = Debug|Win32 - {2A267ABC-21E2-4166-93FA-19AEB38B5C87}.Debug|x86.Build.0 = Debug|Win32 - {2A267ABC-21E2-4166-93FA-19AEB38B5C87}.Release|x64.ActiveCfg = Release|x64 - {2A267ABC-21E2-4166-93FA-19AEB38B5C87}.Release|x64.Build.0 = Release|x64 - {2A267ABC-21E2-4166-93FA-19AEB38B5C87}.Release|x86.ActiveCfg = Release|Win32 - {2A267ABC-21E2-4166-93FA-19AEB38B5C87}.Release|x86.Build.0 = Release|Win32 - {B5B41CDA-BE4B-43C8-9E9D-D7A261FA5396}.Debug|x64.ActiveCfg = Debug|x64 - {B5B41CDA-BE4B-43C8-9E9D-D7A261FA5396}.Debug|x64.Build.0 = Debug|x64 - {B5B41CDA-BE4B-43C8-9E9D-D7A261FA5396}.Debug|x86.ActiveCfg = Debug|Win32 - {B5B41CDA-BE4B-43C8-9E9D-D7A261FA5396}.Debug|x86.Build.0 = Debug|Win32 - {B5B41CDA-BE4B-43C8-9E9D-D7A261FA5396}.Release|x64.ActiveCfg = Release|x64 - {B5B41CDA-BE4B-43C8-9E9D-D7A261FA5396}.Release|x64.Build.0 = Release|x64 - {B5B41CDA-BE4B-43C8-9E9D-D7A261FA5396}.Release|x86.ActiveCfg = Release|Win32 - {B5B41CDA-BE4B-43C8-9E9D-D7A261FA5396}.Release|x86.Build.0 = Release|Win32 - {F9E896C3-C52E-47B9-96A8-58B819D69373}.Debug|x64.ActiveCfg = Debug|x64 - {F9E896C3-C52E-47B9-96A8-58B819D69373}.Debug|x64.Build.0 = Debug|x64 - {F9E896C3-C52E-47B9-96A8-58B819D69373}.Debug|x86.ActiveCfg = Debug|Win32 - {F9E896C3-C52E-47B9-96A8-58B819D69373}.Debug|x86.Build.0 = Debug|Win32 - {F9E896C3-C52E-47B9-96A8-58B819D69373}.Release|x64.ActiveCfg = Release|x64 - {F9E896C3-C52E-47B9-96A8-58B819D69373}.Release|x64.Build.0 = Release|x64 - {F9E896C3-C52E-47B9-96A8-58B819D69373}.Release|x86.ActiveCfg = Release|Win32 - {F9E896C3-C52E-47B9-96A8-58B819D69373}.Release|x86.Build.0 = Release|Win32 - {F5428427-2228-408B-81FD-F75CFDD4F2B4}.Debug|x64.ActiveCfg = Debug|x64 - {F5428427-2228-408B-81FD-F75CFDD4F2B4}.Debug|x64.Build.0 = Debug|x64 - {F5428427-2228-408B-81FD-F75CFDD4F2B4}.Debug|x86.ActiveCfg = Debug|Win32 - {F5428427-2228-408B-81FD-F75CFDD4F2B4}.Debug|x86.Build.0 = Debug|Win32 - {F5428427-2228-408B-81FD-F75CFDD4F2B4}.Release|x64.ActiveCfg = Release|x64 - {F5428427-2228-408B-81FD-F75CFDD4F2B4}.Release|x64.Build.0 = Release|x64 - {F5428427-2228-408B-81FD-F75CFDD4F2B4}.Release|x86.ActiveCfg = Release|Win32 - {F5428427-2228-408B-81FD-F75CFDD4F2B4}.Release|x86.Build.0 = Release|Win32 - {FE6094EE-5371-4D9B-A90A-0C5D12632EBF}.Debug|x64.ActiveCfg = Debug|x64 - {FE6094EE-5371-4D9B-A90A-0C5D12632EBF}.Debug|x64.Build.0 = Debug|x64 - {FE6094EE-5371-4D9B-A90A-0C5D12632EBF}.Debug|x86.ActiveCfg = Debug|Win32 - {FE6094EE-5371-4D9B-A90A-0C5D12632EBF}.Debug|x86.Build.0 = Debug|Win32 - {FE6094EE-5371-4D9B-A90A-0C5D12632EBF}.Release|x64.ActiveCfg = Release|x64 - {FE6094EE-5371-4D9B-A90A-0C5D12632EBF}.Release|x64.Build.0 = Release|x64 - {FE6094EE-5371-4D9B-A90A-0C5D12632EBF}.Release|x86.ActiveCfg = Release|Win32 - {FE6094EE-5371-4D9B-A90A-0C5D12632EBF}.Release|x86.Build.0 = Release|Win32 - {46BF246B-4151-4048-B4CC-285D1A343CE2}.Debug|x64.ActiveCfg = Debug|x64 - {46BF246B-4151-4048-B4CC-285D1A343CE2}.Debug|x64.Build.0 = Debug|x64 - {46BF246B-4151-4048-B4CC-285D1A343CE2}.Debug|x86.ActiveCfg = Debug|Win32 - {46BF246B-4151-4048-B4CC-285D1A343CE2}.Debug|x86.Build.0 = Debug|Win32 - {46BF246B-4151-4048-B4CC-285D1A343CE2}.Release|x64.ActiveCfg = Release|x64 - {46BF246B-4151-4048-B4CC-285D1A343CE2}.Release|x64.Build.0 = Release|x64 - {46BF246B-4151-4048-B4CC-285D1A343CE2}.Release|x86.ActiveCfg = Release|Win32 - {46BF246B-4151-4048-B4CC-285D1A343CE2}.Release|x86.Build.0 = Release|Win32 - {1536271F-BCB7-4A9A-BFDB-78FABE8D82B7}.Debug|x64.ActiveCfg = Debug|x64 - {1536271F-BCB7-4A9A-BFDB-78FABE8D82B7}.Debug|x64.Build.0 = Debug|x64 - {1536271F-BCB7-4A9A-BFDB-78FABE8D82B7}.Debug|x86.ActiveCfg = Debug|Win32 - {1536271F-BCB7-4A9A-BFDB-78FABE8D82B7}.Debug|x86.Build.0 = Debug|Win32 - {1536271F-BCB7-4A9A-BFDB-78FABE8D82B7}.Release|x64.ActiveCfg = Release|x64 - {1536271F-BCB7-4A9A-BFDB-78FABE8D82B7}.Release|x64.Build.0 = Release|x64 - {1536271F-BCB7-4A9A-BFDB-78FABE8D82B7}.Release|x86.ActiveCfg = Release|Win32 - {1536271F-BCB7-4A9A-BFDB-78FABE8D82B7}.Release|x86.Build.0 = Release|Win32 - {DACA3506-77BD-4532-A8A0-6D5D5E1A5558}.Debug|x64.ActiveCfg = Debug|x64 - {DACA3506-77BD-4532-A8A0-6D5D5E1A5558}.Debug|x64.Build.0 = Debug|x64 - {DACA3506-77BD-4532-A8A0-6D5D5E1A5558}.Debug|x86.ActiveCfg = Debug|Win32 - {DACA3506-77BD-4532-A8A0-6D5D5E1A5558}.Debug|x86.Build.0 = Debug|Win32 - {DACA3506-77BD-4532-A8A0-6D5D5E1A5558}.Release|x64.ActiveCfg = Release|x64 - {DACA3506-77BD-4532-A8A0-6D5D5E1A5558}.Release|x64.Build.0 = Release|x64 - {DACA3506-77BD-4532-A8A0-6D5D5E1A5558}.Release|x86.ActiveCfg = Release|Win32 - {DACA3506-77BD-4532-A8A0-6D5D5E1A5558}.Release|x86.Build.0 = Release|Win32 - {12F21AB0-F00E-426D-A3D1-E47DE8CDBAE8}.Debug|x64.ActiveCfg = Debug|x64 - {12F21AB0-F00E-426D-A3D1-E47DE8CDBAE8}.Debug|x64.Build.0 = Debug|x64 - {12F21AB0-F00E-426D-A3D1-E47DE8CDBAE8}.Debug|x86.ActiveCfg = Debug|Win32 - {12F21AB0-F00E-426D-A3D1-E47DE8CDBAE8}.Debug|x86.Build.0 = Debug|Win32 - {12F21AB0-F00E-426D-A3D1-E47DE8CDBAE8}.Release|x64.ActiveCfg = Release|x64 - {12F21AB0-F00E-426D-A3D1-E47DE8CDBAE8}.Release|x64.Build.0 = Release|x64 - {12F21AB0-F00E-426D-A3D1-E47DE8CDBAE8}.Release|x86.ActiveCfg = Release|Win32 - {12F21AB0-F00E-426D-A3D1-E47DE8CDBAE8}.Release|x86.Build.0 = Release|Win32 - {F0BA1CD4-B8E5-437D-B0D4-1DAF4A652AB3}.Debug|x64.ActiveCfg = Debug|x64 - {F0BA1CD4-B8E5-437D-B0D4-1DAF4A652AB3}.Debug|x64.Build.0 = Debug|x64 - {F0BA1CD4-B8E5-437D-B0D4-1DAF4A652AB3}.Debug|x86.ActiveCfg = Debug|Win32 - {F0BA1CD4-B8E5-437D-B0D4-1DAF4A652AB3}.Debug|x86.Build.0 = Debug|Win32 - {F0BA1CD4-B8E5-437D-B0D4-1DAF4A652AB3}.Release|x64.ActiveCfg = Release|x64 - {F0BA1CD4-B8E5-437D-B0D4-1DAF4A652AB3}.Release|x64.Build.0 = Release|x64 - {F0BA1CD4-B8E5-437D-B0D4-1DAF4A652AB3}.Release|x86.ActiveCfg = Release|Win32 - {F0BA1CD4-B8E5-437D-B0D4-1DAF4A652AB3}.Release|x86.Build.0 = Release|Win32 - {2E5A800D-8DD7-43EA-83C3-2E1ED6F547CB}.Debug|x64.ActiveCfg = Debug|x64 - {2E5A800D-8DD7-43EA-83C3-2E1ED6F547CB}.Debug|x64.Build.0 = Debug|x64 - {2E5A800D-8DD7-43EA-83C3-2E1ED6F547CB}.Debug|x86.ActiveCfg = Debug|Win32 - {2E5A800D-8DD7-43EA-83C3-2E1ED6F547CB}.Debug|x86.Build.0 = Debug|Win32 - {2E5A800D-8DD7-43EA-83C3-2E1ED6F547CB}.Release|x64.ActiveCfg = Release|x64 - {2E5A800D-8DD7-43EA-83C3-2E1ED6F547CB}.Release|x64.Build.0 = Release|x64 - {2E5A800D-8DD7-43EA-83C3-2E1ED6F547CB}.Release|x86.ActiveCfg = Release|Win32 - {2E5A800D-8DD7-43EA-83C3-2E1ED6F547CB}.Release|x86.Build.0 = Release|Win32 - {479BBF48-BF4B-42AF-AF55-6D4E0A74C987}.Debug|x64.ActiveCfg = Debug|x64 - {479BBF48-BF4B-42AF-AF55-6D4E0A74C987}.Debug|x64.Build.0 = Debug|x64 - {479BBF48-BF4B-42AF-AF55-6D4E0A74C987}.Debug|x86.ActiveCfg = Debug|Win32 - {479BBF48-BF4B-42AF-AF55-6D4E0A74C987}.Debug|x86.Build.0 = Debug|Win32 - {479BBF48-BF4B-42AF-AF55-6D4E0A74C987}.Release|x64.ActiveCfg = Release|x64 - {479BBF48-BF4B-42AF-AF55-6D4E0A74C987}.Release|x64.Build.0 = Release|x64 - {479BBF48-BF4B-42AF-AF55-6D4E0A74C987}.Release|x86.ActiveCfg = Release|Win32 - {479BBF48-BF4B-42AF-AF55-6D4E0A74C987}.Release|x86.Build.0 = Release|Win32 - {2B7506AD-B420-4F2B-B002-6AAAF79D1E01}.Debug|x64.ActiveCfg = Debug|x64 - {2B7506AD-B420-4F2B-B002-6AAAF79D1E01}.Debug|x64.Build.0 = Debug|x64 - {2B7506AD-B420-4F2B-B002-6AAAF79D1E01}.Debug|x86.ActiveCfg = Debug|Win32 - {2B7506AD-B420-4F2B-B002-6AAAF79D1E01}.Debug|x86.Build.0 = Debug|Win32 - {2B7506AD-B420-4F2B-B002-6AAAF79D1E01}.Release|x64.ActiveCfg = Release|x64 - {2B7506AD-B420-4F2B-B002-6AAAF79D1E01}.Release|x64.Build.0 = Release|x64 - {2B7506AD-B420-4F2B-B002-6AAAF79D1E01}.Release|x86.ActiveCfg = Release|Win32 - {2B7506AD-B420-4F2B-B002-6AAAF79D1E01}.Release|x86.Build.0 = Release|Win32 - {46D6A7E3-73D9-422A-AD53-94D96380CDD5}.Debug|x64.ActiveCfg = Debug|x64 - {46D6A7E3-73D9-422A-AD53-94D96380CDD5}.Debug|x64.Build.0 = Debug|x64 - {46D6A7E3-73D9-422A-AD53-94D96380CDD5}.Debug|x86.ActiveCfg = Debug|Win32 - {46D6A7E3-73D9-422A-AD53-94D96380CDD5}.Debug|x86.Build.0 = Debug|Win32 - {46D6A7E3-73D9-422A-AD53-94D96380CDD5}.Release|x64.ActiveCfg = Release|x64 - {46D6A7E3-73D9-422A-AD53-94D96380CDD5}.Release|x64.Build.0 = Release|x64 - {46D6A7E3-73D9-422A-AD53-94D96380CDD5}.Release|x86.ActiveCfg = Release|Win32 - {46D6A7E3-73D9-422A-AD53-94D96380CDD5}.Release|x86.Build.0 = Release|Win32 - {3C1AA064-9D06-41FD-AB32-90832A03F452}.Debug|x64.ActiveCfg = Debug|x64 - {3C1AA064-9D06-41FD-AB32-90832A03F452}.Debug|x64.Build.0 = Debug|x64 - {3C1AA064-9D06-41FD-AB32-90832A03F452}.Debug|x86.ActiveCfg = Debug|Win32 - {3C1AA064-9D06-41FD-AB32-90832A03F452}.Debug|x86.Build.0 = Debug|Win32 - {3C1AA064-9D06-41FD-AB32-90832A03F452}.Release|x64.ActiveCfg = Release|x64 - {3C1AA064-9D06-41FD-AB32-90832A03F452}.Release|x64.Build.0 = Release|x64 - {3C1AA064-9D06-41FD-AB32-90832A03F452}.Release|x86.ActiveCfg = Release|Win32 - {3C1AA064-9D06-41FD-AB32-90832A03F452}.Release|x86.Build.0 = Release|Win32 - {8608D71A-A686-41A2-9861-0FCD7DAF00AE}.Debug|x64.ActiveCfg = Debug|x64 - {8608D71A-A686-41A2-9861-0FCD7DAF00AE}.Debug|x64.Build.0 = Debug|x64 - {8608D71A-A686-41A2-9861-0FCD7DAF00AE}.Debug|x86.ActiveCfg = Debug|Win32 - {8608D71A-A686-41A2-9861-0FCD7DAF00AE}.Debug|x86.Build.0 = Debug|Win32 - {8608D71A-A686-41A2-9861-0FCD7DAF00AE}.Release|x64.ActiveCfg = Release|x64 - {8608D71A-A686-41A2-9861-0FCD7DAF00AE}.Release|x64.Build.0 = Release|x64 - {8608D71A-A686-41A2-9861-0FCD7DAF00AE}.Release|x86.ActiveCfg = Release|Win32 - {8608D71A-A686-41A2-9861-0FCD7DAF00AE}.Release|x86.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {3C0D173C-82A1-43AB-8E9C-DE3F0067AD59} = {E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB} - {84B611CC-F139-4EC6-8ABB-7BD176E152A8} = {E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB} - {5E4753A9-63CA-449D-A28D-E0B9F77BE1E2} = {E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB} - {59D4112B-F51B-4FCE-ADD0-A6DA933FE708} = {E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB} - {E97885DB-2D89-40CC-B608-8E9071FB3930} = {E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB} - {388C602D-8120-40F4-B6FD-69A3559374B6} = {E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB} - {AEB7FC97-00B4-4264-A8E0-F265ACFD4A1F} = {E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB} - {20969476-9E64-4E4F-981C-590900DB1EEA} = {E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB} - {189239CA-029E-4124-826B-F30AE3A87D68} = {E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB} - {DDF1DCE3-3171-4DF4-872D-C729E9857D19} = {E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB} - {B6288555-A145-4E3A-9A6E-13D523272331} = {E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB} - {2A267ABC-21E2-4166-93FA-19AEB38B5C87} = {E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB} - {B5B41CDA-BE4B-43C8-9E9D-D7A261FA5396} = {E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB} - {F9E896C3-C52E-47B9-96A8-58B819D69373} = {E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB} - {F5428427-2228-408B-81FD-F75CFDD4F2B4} = {E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB} - {FE6094EE-5371-4D9B-A90A-0C5D12632EBF} = {E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB} - {46BF246B-4151-4048-B4CC-285D1A343CE2} = {E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB} - {1536271F-BCB7-4A9A-BFDB-78FABE8D82B7} = {E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB} - {DACA3506-77BD-4532-A8A0-6D5D5E1A5558} = {E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB} - {12F21AB0-F00E-426D-A3D1-E47DE8CDBAE8} = {E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB} - {F0BA1CD4-B8E5-437D-B0D4-1DAF4A652AB3} = {E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB} - {2E5A800D-8DD7-43EA-83C3-2E1ED6F547CB} = {E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB} - {479BBF48-BF4B-42AF-AF55-6D4E0A74C987} = {E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB} - {2B7506AD-B420-4F2B-B002-6AAAF79D1E01} = {E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB} - {46D6A7E3-73D9-422A-AD53-94D96380CDD5} = {E9DBB2E8-C9C5-4F46-9E6D-84D796FF4ABB} - {3C1AA064-9D06-41FD-AB32-90832A03F452} = {07434F7B-DE5A-4C13-BC49-4CBCE12D0040} - {8608D71A-A686-41A2-9861-0FCD7DAF00AE} = {07434F7B-DE5A-4C13-BC49-4CBCE12D0040} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {A2B87694-5EB1-4C97-9262-7E18C4A3702E} - EndGlobalSection -EndGlobal diff --git a/vs/32blit/32blit.vcxproj b/vs/32blit/32blit.vcxproj deleted file mode 100644 index f455af8e2..000000000 --- a/vs/32blit/32blit.vcxproj +++ /dev/null @@ -1,216 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {280015A3-83D7-416F-A181-7CF88BCCE12F} - My32blit - 10.0 - - - - StaticLibrary - true - v142 - Unicode - - - StaticLibrary - false - v142 - true - Unicode - - - StaticLibrary - true - v142 - Unicode - - - StaticLibrary - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - $(ProjectDir);$(IncludePath) - - - true - $(ProjectDir);$(IncludePath) - - - false - $(ProjectDir);$(IncludePath) - - - false - $(ProjectDir);$(IncludePath) - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - stdcpp17 - - - Console - true - - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - stdcpp17 - - - Console - true - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - stdcpp17 - - - Console - true - true - true - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - stdcpp17 - - - Console - true - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vs/32blit/32blit.vcxproj.filters b/vs/32blit/32blit.vcxproj.filters deleted file mode 100644 index 54a5e4c86..000000000 --- a/vs/32blit/32blit.vcxproj.filters +++ /dev/null @@ -1,201 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;ipp;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - {74824303-7147-4134-b9c2-0b8307b59d44} - - - {c3db4432-9b5b-4a68-8813-32f7f67b38e8} - - - {e48bfb82-8c00-4045-a266-5b5918deb3f1} - - - {24bcc5a5-909a-4655-b1b9-5398ecd8f48a} - - - {9248dddd-5382-4608-8c3f-7e9c40ec9eff} - - - - - Header Files - - - Header Files - - - engine - - - engine - - - engine - - - engine - - - engine - - - engine - - - graphics - - - graphics - - - graphics - - - graphics - - - graphics - - - graphics - - - graphics - - - math - - - types - - - types - - - types - - - types - - - types - - - types - - - types - - - types - - - audio - - - math - - - Header Files - - - engine - - - - - engine - - - engine - - - engine - - - engine - - - engine - - - engine - - - graphics - - - graphics - - - graphics - - - graphics - - - graphics - - - graphics - - - graphics - - - graphics - - - graphics - - - graphics - - - graphics - - - math - - - types - - - types - - - types - - - types - - - types - - - audio - - - math - - - Source Files - - - engine - - - \ No newline at end of file diff --git a/vs/32blit/version_defs.hpp b/vs/32blit/version_defs.hpp deleted file mode 100644 index 76130ba79..000000000 --- a/vs/32blit/version_defs.hpp +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -#define BLIT_BUILD_DATE "UNKNOWN" -#define BLIT_BUILD_VER "VS-DEV" diff --git a/vs/examples/.gitignore b/vs/examples/.gitignore deleted file mode 100644 index 4ea622083..000000000 --- a/vs/examples/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -# -# VS specific gitignore -# - -# -# Text project asset is named differently -# -font_asset.cpp -font_asset.hpp \ No newline at end of file diff --git a/vs/examples/another-world/another-world.vcxproj b/vs/examples/another-world/another-world.vcxproj deleted file mode 100644 index 476f6a848..000000000 --- a/vs/examples/another-world/another-world.vcxproj +++ /dev/null @@ -1,167 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {0E95737A-05EE-4A68-A016-8C7D7F50FBA8} - another-world - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - - - true - - - false - - - false - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vs/examples/audio-test/audio-test.vcxproj b/vs/examples/audio-test/audio-test.vcxproj deleted file mode 100644 index e4d9718d1..000000000 --- a/vs/examples/audio-test/audio-test.vcxproj +++ /dev/null @@ -1,165 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {2E5A800D-8DD7-43EA-83C3-2E1ED6F547CB} - audiotest - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - - - true - - - false - - - false - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - - - - - - - - diff --git a/vs/examples/doom-fire/doom-fire.vcxproj b/vs/examples/doom-fire/doom-fire.vcxproj deleted file mode 100644 index 03053803c..000000000 --- a/vs/examples/doom-fire/doom-fire.vcxproj +++ /dev/null @@ -1,165 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {84B611CC-F139-4EC6-8ABB-7BD176E152A8} - doomfire - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - - - true - - - false - - - false - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - - - - - - - - \ No newline at end of file diff --git a/vs/examples/fizzlefade/fizzlefade.vcxproj b/vs/examples/fizzlefade/fizzlefade.vcxproj deleted file mode 100644 index ae220efbf..000000000 --- a/vs/examples/fizzlefade/fizzlefade.vcxproj +++ /dev/null @@ -1,165 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {5E4753A9-63CA-449D-A28D-E0B9F77BE1E2} - fizzlefade - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - - - true - - - false - - - false - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - - - - - - - - diff --git a/vs/examples/flight/flight.vcxproj b/vs/examples/flight/flight.vcxproj deleted file mode 100644 index c37608b99..000000000 --- a/vs/examples/flight/flight.vcxproj +++ /dev/null @@ -1,183 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {59D4112B-F51B-4FCE-ADD0-A6DA933FE708} - flight - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\flight\assets.yml --output $(ProjectDir) - - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\flight\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\flight\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\flight\assets.yml --output $(ProjectDir) - - - - - - - - - - - - - - diff --git a/vs/examples/geometry/geometry.vcxproj b/vs/examples/geometry/geometry.vcxproj deleted file mode 100644 index 4ccbfdaf4..000000000 --- a/vs/examples/geometry/geometry.vcxproj +++ /dev/null @@ -1,183 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {E97885DB-2D89-40CC-B608-8E9071FB3930} - geometry - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\geometry\assets.yml --output $(ProjectDir) - - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\geometry\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\geometry\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\geometry\assets.yml --output $(ProjectDir) - - - - - - - - - - - - - - diff --git a/vs/examples/hardware-test/hardware-test.vcxproj b/vs/examples/hardware-test/hardware-test.vcxproj deleted file mode 100644 index 089fcc733..000000000 --- a/vs/examples/hardware-test/hardware-test.vcxproj +++ /dev/null @@ -1,165 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {388C602D-8120-40F4-B6FD-69A3559374B6} - hardwaretest - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - - - true - - - false - - - false - - - - Level3 - false - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - - - Level3 - false - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - false - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - false - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - - - - - - - - diff --git a/vs/examples/logo/logo.vcxproj b/vs/examples/logo/logo.vcxproj deleted file mode 100644 index 73a7d8269..000000000 --- a/vs/examples/logo/logo.vcxproj +++ /dev/null @@ -1,165 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {3C0D173C-82A1-43AB-8E9C-DE3F0067AD59} - logo - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - - - true - - - false - - - false - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - - - - - - - - \ No newline at end of file diff --git a/vs/examples/matrix-test/matrix-test.vcxproj b/vs/examples/matrix-test/matrix-test.vcxproj deleted file mode 100644 index e3ea20805..000000000 --- a/vs/examples/matrix-test/matrix-test.vcxproj +++ /dev/null @@ -1,165 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {AEB7FC97-00B4-4264-A8E0-F265ACFD4A1F} - matrixtest - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - - - true - - - false - - - false - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - - - - - - - - diff --git a/vs/examples/palette-cycle/palette-cycle.vcxproj b/vs/examples/palette-cycle/palette-cycle.vcxproj deleted file mode 100644 index 48efd2f50..000000000 --- a/vs/examples/palette-cycle/palette-cycle.vcxproj +++ /dev/null @@ -1,181 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {20969476-9E64-4E4F-981C-590900DB1EEA} - palettecycle - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\palette-cycle\assets.yml --output $(ProjectDir) - - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\palette-cycle\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\palette-cycle\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\palette-cycle\assets.yml --output $(ProjectDir) - - - - - - - - - - - - diff --git a/vs/examples/palette-swap/palette-swap.vcxproj b/vs/examples/palette-swap/palette-swap.vcxproj deleted file mode 100644 index 305d8ed41..000000000 --- a/vs/examples/palette-swap/palette-swap.vcxproj +++ /dev/null @@ -1,181 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {189239CA-029E-4124-826B-F30AE3A87D68} - paletteswap - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\palette-swap\assets.yml --output $(ProjectDir) - - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\palette-swap\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\palette-swap\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\palette-swap\assets.yml --output $(ProjectDir) - - - - - - - - - - - - diff --git a/vs/examples/particle/particle.vcxproj b/vs/examples/particle/particle.vcxproj deleted file mode 100644 index 564a4c342..000000000 --- a/vs/examples/particle/particle.vcxproj +++ /dev/null @@ -1,165 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {DDF1DCE3-3171-4DF4-872D-C729E9857D19} - particle - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - - - true - - - false - - - false - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - - - - - - - - diff --git a/vs/examples/platformer/platformer.vcxproj b/vs/examples/platformer/platformer.vcxproj deleted file mode 100644 index d55d8721f..000000000 --- a/vs/examples/platformer/platformer.vcxproj +++ /dev/null @@ -1,183 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {B6288555-A145-4E3A-9A6E-13D523272331} - platformer - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\platformer\assets.yml --output $(ProjectDir) - - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\platformer\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\platformer\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\platformer\assets.yml --output $(ProjectDir) - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vs/examples/raycaster/raycaster.vcxproj b/vs/examples/raycaster/raycaster.vcxproj deleted file mode 100644 index 8ca5fe6ff..000000000 --- a/vs/examples/raycaster/raycaster.vcxproj +++ /dev/null @@ -1,183 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {2A267ABC-21E2-4166-93FA-19AEB38B5C87} - raycaster - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\raycaster\assets.yml --output $(ProjectDir) - - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\raycaster\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\raycaster\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\raycaster\assets.yml --output $(ProjectDir) - - - - - - - - - - - - - - diff --git a/vs/examples/rotozoom/rotozoom.vcxproj b/vs/examples/rotozoom/rotozoom.vcxproj deleted file mode 100644 index 7dc6a3e8e..000000000 --- a/vs/examples/rotozoom/rotozoom.vcxproj +++ /dev/null @@ -1,165 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {B5B41CDA-BE4B-43C8-9E9D-D7A261FA5396} - rotozoom - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - - - true - - - false - - - false - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - - - - - - - - diff --git a/vs/examples/scrolly-tile/scrolly-tile.vcxproj b/vs/examples/scrolly-tile/scrolly-tile.vcxproj deleted file mode 100644 index a7a25e3a3..000000000 --- a/vs/examples/scrolly-tile/scrolly-tile.vcxproj +++ /dev/null @@ -1,165 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {F9E896C3-C52E-47B9-96A8-58B819D69373} - scrollytile - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - - - true - - - false - - - false - - - - Level3 - false - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - - - Level3 - false - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - false - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - false - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - - - - - - - - diff --git a/vs/examples/shmup/shmup.vcxproj b/vs/examples/shmup/shmup.vcxproj deleted file mode 100644 index 971d42187..000000000 --- a/vs/examples/shmup/shmup.vcxproj +++ /dev/null @@ -1,181 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {F5428427-2228-408B-81FD-F75CFDD4F2B4} - shmup - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\shmup\assets.yml --output $(ProjectDir) - - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\shmup\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\shmup\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\shmup\assets.yml --output $(ProjectDir) - - - - - - - - - - - - diff --git a/vs/examples/sprite-test/sprite-test.vcxproj b/vs/examples/sprite-test/sprite-test.vcxproj deleted file mode 100644 index 143ea97dd..000000000 --- a/vs/examples/sprite-test/sprite-test.vcxproj +++ /dev/null @@ -1,183 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {FE6094EE-5371-4D9B-A90A-0C5D12632EBF} - spritetest - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\sprite-test\assets.yml --output $(ProjectDir) - - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\sprite-test\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\sprite-test\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\sprite-test\assets.yml --output $(ProjectDir) - - - - - - - - - - - - - - diff --git a/vs/examples/text/text.vcxproj b/vs/examples/text/text.vcxproj deleted file mode 100644 index 14fc0a89d..000000000 --- a/vs/examples/text/text.vcxproj +++ /dev/null @@ -1,183 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {479BBF48-BF4B-42AF-AF55-6D4E0A74C987} - text - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\text\assets.yml --output $(ProjectDir) - - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\text\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\text\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\text\assets.yml --output $(ProjectDir) - - - - - - - - - - - - - - diff --git a/vs/examples/tilemap_test/tilemap_test.vcxproj b/vs/examples/tilemap_test/tilemap_test.vcxproj deleted file mode 100644 index 14c142277..000000000 --- a/vs/examples/tilemap_test/tilemap_test.vcxproj +++ /dev/null @@ -1,184 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {46BF246B-4151-4048-B4CC-285D1A343CE2} - tilemaptest - 10.0 - true - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\tilemap-test\assets.yml --output $(ProjectDir) - - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\tilemap-test\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\tilemap-test\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\tilemap-test\assets.yml --output $(ProjectDir) - - - - - - - - - - - - - - diff --git a/vs/examples/tilt/tilt.vcxproj b/vs/examples/tilt/tilt.vcxproj deleted file mode 100644 index 5141a5cc1..000000000 --- a/vs/examples/tilt/tilt.vcxproj +++ /dev/null @@ -1,165 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {1536271F-BCB7-4A9A-BFDB-78FABE8D82B7} - tilt - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - - - true - - - false - - - false - - - - Level3 - false - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - - - - - - - - diff --git a/vs/examples/timer-test/timer-test.vcxproj b/vs/examples/timer-test/timer-test.vcxproj deleted file mode 100644 index 4e1f2190a..000000000 --- a/vs/examples/timer-test/timer-test.vcxproj +++ /dev/null @@ -1,165 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {DACA3506-77BD-4532-A8A0-6D5D5E1A5558} - doomfire - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - - - true - - - false - - - false - - - - Level3 - false - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - - - Level3 - false - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - false - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - false - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - - - - - - - - \ No newline at end of file diff --git a/vs/examples/tunnel/tunnel.vcxproj b/vs/examples/tunnel/tunnel.vcxproj deleted file mode 100644 index fe3882588..000000000 --- a/vs/examples/tunnel/tunnel.vcxproj +++ /dev/null @@ -1,181 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {12F21AB0-F00E-426D-A3D1-E47DE8CDBAE8} - tunnel - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\tunnel\assets.yml --output $(ProjectDir) - - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\tunnel\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\tunnel\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\tunnel\assets.yml --output $(ProjectDir) - - - - - - - - - - - - diff --git a/vs/examples/tween-demo/tween-demo.vcxproj b/vs/examples/tween-demo/tween-demo.vcxproj deleted file mode 100644 index 52d8ddded..000000000 --- a/vs/examples/tween-demo/tween-demo.vcxproj +++ /dev/null @@ -1,165 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {46D6A7E3-73D9-422A-AD53-94D96380CDD5} - tweendemo - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - - - true - - - false - - - false - - - - Level3 - false - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - - - Level3 - false - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - false - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - false - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - - - - - - - - \ No newline at end of file diff --git a/vs/examples/tween-test/tween-test.vcxproj b/vs/examples/tween-test/tween-test.vcxproj deleted file mode 100644 index 53a2567a1..000000000 --- a/vs/examples/tween-test/tween-test.vcxproj +++ /dev/null @@ -1,165 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {F0BA1CD4-B8E5-437D-B0D4-1DAF4A652AB3} - tweentest - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - - - true - - - false - - - false - - - - Level3 - false - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - - - Level3 - false - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - false - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - false - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - - - - - - - - diff --git a/vs/examples/voxel/voxel.vcxproj b/vs/examples/voxel/voxel.vcxproj deleted file mode 100644 index b56c304a8..000000000 --- a/vs/examples/voxel/voxel.vcxproj +++ /dev/null @@ -1,191 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {2B7506AD-B420-4F2B-B002-6AAAF79D1E01} - voxel - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProjectDir) - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\voxel\assets.yml --output $(ProjectDir) - - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\voxel\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\voxel\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\..\32blit;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - 32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\..\examples\voxel\assets.yml --output $(ProjectDir) - - - - - - - - - - - - - {85db89b5-dea0-4429-b41e-0caa7db907ba} - - - {280015a3-83d7-416f-a181-7cf88bcce12f} - - - - - - diff --git a/vs/launcher-shared/launcher-shared.vcxproj b/vs/launcher-shared/launcher-shared.vcxproj deleted file mode 100644 index 1be9fd81f..000000000 --- a/vs/launcher-shared/launcher-shared.vcxproj +++ /dev/null @@ -1,179 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {3C1AA064-9D06-41FD-AB32-90832A03F452} - Launcher - 10.0 - - - - StaticLibrary - true - v142 - Unicode - - - StaticLibrary - false - v142 - true - Unicode - - - StaticLibrary - true - v142 - Unicode - - - StaticLibrary - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - $(ProjectDir);$(IncludePath) - - - true - $(ProjectDir);$(IncludePath) - - - false - $(ProjectDir);$(IncludePath) - - - false - $(ProjectDir);$(IncludePath) - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - stdcpp17 - ..\..\32blit;%(AdditionalIncludeDirectories) - - - Console - true - - - 32blit.lib - $(OutputPath) - - - - - Level3 - true - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - stdcpp17 - ..\..\32blit;%(AdditionalIncludeDirectories) - - - Console - true - - - 32blit.lib - $(OutputPath) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - stdcpp17 - ..\..\32blit;%(AdditionalIncludeDirectories) - - - Console - true - true - true - - - 32blit.lib - $(OutputPath) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - stdcpp17 - ..\..\32blit;%(AdditionalIncludeDirectories) - - - Console - true - true - true - - - 32blit.lib - $(OutputPath) - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vs/launcher-shared/launcher-shared.vcxproj.filters b/vs/launcher-shared/launcher-shared.vcxproj.filters deleted file mode 100644 index 3d2b327d8..000000000 --- a/vs/launcher-shared/launcher-shared.vcxproj.filters +++ /dev/null @@ -1,27 +0,0 @@ - - - - - Header Files - - - Header Files - - - Header Files - - - - - {4f2d726b-4611-4c2f-937c-dde3cd0ee0aa} - - - {3ba7dc39-cdf2-4378-a42f-046548e07eee} - - - - - Source Files - - - \ No newline at end of file diff --git a/vs/launcher/launcher.vcxproj b/vs/launcher/launcher.vcxproj deleted file mode 100644 index 3a8f085d1..000000000 --- a/vs/launcher/launcher.vcxproj +++ /dev/null @@ -1,183 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - {8608d71a-a686-41a2-9861-0fcd7daf00ae} - logo - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - - - true - - - false - - - false - - - - Level3 - false - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\32blit;..\..\launcher-shared;..\..\vs\launcher;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - launcher-shared.lib;32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\launcher\assets.yml --output $(ProjectDir) - - - - - Level3 - false - _DEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\32blit;..\..\launcher-shared;..\..\vs\launcher;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - launcher-shared.lib;32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\launcher\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - false - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\32blit;..\..\launcher-shared;..\..\vs\launcher;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - launcher-shared.lib;32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\launcher\assets.yml --output $(ProjectDir) - - - - - Level3 - true - true - false - NDEBUG;_CONSOLE;WIN32;%(PreprocessorDefinitions) - true - ..\..\32blit;..\..\launcher-shared;..\..\vs\launcher;%(AdditionalIncludeDirectories) - stdcpp17 - - - Console - true - true - true - $(OutputPath);$(SolutionDir)sdl\lib\$(PlatformTarget)\ - launcher-shared.lib;32blit.lib;32blit-sdl.lib;SDL2.lib;SDL2main.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - python -m ttblit pack --force --config $(ProjectDir)..\..\launcher\assets.yml --output $(ProjectDir) - - - - - - - - - - - - - - - - - - diff --git a/vs/launcher/launcher.vcxproj.filters b/vs/launcher/launcher.vcxproj.filters deleted file mode 100644 index 58a851757..000000000 --- a/vs/launcher/launcher.vcxproj.filters +++ /dev/null @@ -1,39 +0,0 @@ - - - - - {d8ee93be-b18e-4225-aee2-746bdc92e684} - - - {cf1004b2-0819-42ce-b267-25bc09ec4c38} - - - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - \ No newline at end of file